Does allocating cooperative individuals to high-degree nodes prevent isolation?

round = NULL
gameID = NULL 
nodes = NULL
meanDegree = NULL
meanDegreeCoop = NULL #mean degree among those who cooperated
meanDegreeDefect = NULL #mean degree among those who defected
meanDist = NULL #mean shortest path length divided by the maximum possible path length (Nvertices - 1)
maxDist = NULL #max shortest path length divided by the maximum possible path length (Nvertices - 1)
coefGlobal = NULL #global clustering coefficient
percentCoop = NULL #proportion of those who cooperated
percentCoopPopular = NULL #proportion of those who cooperated, among those with degree >=10
coopEnv = NULL 
assort = NULL

for(i in 1:length(g.isolation)){
    round[i] =  mean(V(g.isolation[[i]])$round)
    gameID[i] = V(g.isolation[[i]])$gameID[1]
    nodes[i] = vcount(g.isolation[[i]])
    meanDegree[i] = mean(igraph::degree(g.isolation[[i]]),na.rm=TRUE)
    meanDegreeCoop[i] = mean(igraph::degree(g.isolation[[i]])[V(g.isolation[[i]])$behavior=="C"],na.rm=TRUE)
    meanDegreeDefect[i] = mean(igraph::degree(g.isolation[[i]])[V(g.isolation[[i]])$behavior=="D"],na.rm=TRUE)
    meanDist[i] = mean(distances(g.isolation[[i]])[distances(g.isolation[[i]])!=0 & distances(g.isolation[[i]])!=Inf],na.rm=TRUE) / length(V(g.isolation[[i]])-1)
    maxDist[i] = max(distances(g.isolation[[i]])[distances(g.isolation[[i]])!=0 & distances(g.isolation[[i]])!=Inf],na.rm=TRUE) / length(V(g.isolation[[i]])-1)
    coefGlobal[i] = transitivity(g.isolation[[i]], type="global")
    percentCoop[i] = prop.table(table(V(g.isolation[[i]])$behavior))["C"]
    percentCoopPopular[i] = prop.table(table(V(g.isolation[[i]])$behavior[igraph::degree(g.isolation[[i]])>=6]))["C"]
    coopEnv[i] = sum(ifelse(V(g.isolation[[i]])$behavior=="C",1,0)*igraph::degree(g.isolation[[i]])/sum(igraph::degree(g.isolation[[i]])),na.rm=TRUE)
    assort[i] = assortativity(g.isolation[[i]], V(g.isolation[[i]])$behavior == "C")
}

smallWorld = data.frame(
  round = round,
  gameID = gameID,
  nodes = nodes,
  meanDegree = meanDegree,
  meanDegreeCoop = meanDegreeCoop,
  meanDegreeDefect = meanDegreeDefect,
  diffDegreeCD = meanDegreeCoop - meanDegreeDefect,
  meanDist = meanDist,
  maxDist = maxDist,
  coefGlobal = coefGlobal,
  percentCoop = percentCoop,
  percentCoopPopular = percentCoopPopular,
  coopEnv = coopEnv,
  assort = assort
)


round = NULL
gameID = NULL
visibleWealth = NULL
n=1
for(i in unique(cdata$round)){
  for(m in unique(cdata$gameID)){
    round[n] = as.numeric(i)-1
    gameID[n] = m
    visibleWealth[n] = ifelse(cdata[cdata$round==i & cdata$gameID==m,]$showScore[1]=="true",1,0)
    n=n+1
  }
}

smallWorld.2 = data.frame(
  round = round,
  gameID = gameID,
  visibleWealth = visibleWealth
)

smallWorld = merge(smallWorld, smallWorld.2, by=c("gameID","round"), all.x=TRUE)

smallWorld.initial = subset(smallWorld, smallWorld$round==0)

#percent of people that end up being isolated for each gameID
percentIsolated = NULL
percentIsolated = aggregate(isolated ~ gameID, data=sample.wide, FUN=max, na.rm=TRUE)
smallWorld.initial = merge(smallWorld.initial[c("gameID","meanDegree","meanDegreeCoop","meanDegreeDefect","diffDegreeCD","meanDist","coefGlobal","visibleWealth","percentCoop","percentCoopPopular","coopEnv","assort")],percentIsolated, by="gameID", all.x=TRUE)

percentIsolated = NULL
percentIsolated = aggregate(isolated ~ gameID, data=sample.wide, FUN=mean, na.rm=TRUE)
percentIsolated = percentIsolated %>% rename(
  percentIsolated = isolated
)
smallWorld.initial = merge(smallWorld.initial,percentIsolated, by="gameID", all.x=TRUE)




reg = glm(isolated ~ coopEnv, 
      data = smallWorld.initial,
      family = binomial(link = "logit"))
summary(reg)
## 
## Call:
## glm(formula = isolated ~ coopEnv, family = binomial(link = "logit"), 
##     data = smallWorld.initial)
## 
## Deviance Residuals: 
##     Min       1Q   Median       3Q      Max  
## -2.3756   0.2641   0.4839   0.6926   1.3696  
## 
## Coefficients:
##             Estimate Std. Error z value Pr(>|z|)    
## (Intercept)    6.047      1.734   3.487 0.000489 ***
## coopEnv       -6.813      2.351  -2.898 0.003750 ** 
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## 
## (Dispersion parameter for binomial family taken to be 1)
## 
##     Null deviance: 82.760  on 79  degrees of freedom
## Residual deviance: 72.371  on 78  degrees of freedom
## AIC: 76.371
## 
## Number of Fisher Scoring iterations: 5
reg = glm(isolated ~ coopEnv*percentCoop, 
      data = smallWorld.initial,
      family = binomial(link = "logit"))
summary(reg)
## 
## Call:
## glm(formula = isolated ~ coopEnv * percentCoop, family = binomial(link = "logit"), 
##     data = smallWorld.initial)
## 
## Deviance Residuals: 
##     Min       1Q   Median       3Q      Max  
## -2.2132   0.4220   0.4658   0.5862   1.7551  
## 
## Coefficients:
##                     Estimate Std. Error z value Pr(>|z|)
## (Intercept)           -3.096      6.866  -0.451    0.652
## coopEnv               10.481     12.639   0.829    0.407
## percentCoop           10.681     12.929   0.826    0.409
## coopEnv:percentCoop  -20.525     14.822  -1.385    0.166
## 
## (Dispersion parameter for binomial family taken to be 1)
## 
##     Null deviance: 82.760  on 79  degrees of freedom
## Residual deviance: 70.472  on 76  degrees of freedom
## AIC: 78.472
## 
## Number of Fisher Scoring iterations: 4
reg = glm(isolated ~ assort, 
      data = smallWorld.initial,
      family = binomial(link = "logit"))
summary(reg)
## 
## Call:
## glm(formula = isolated ~ assort, family = binomial(link = "logit"), 
##     data = smallWorld.initial)
## 
## Deviance Residuals: 
##     Min       1Q   Median       3Q      Max  
## -1.9579   0.5132   0.6439   0.7269   1.0178  
## 
## Coefficients:
##             Estimate Std. Error z value Pr(>|z|)    
## (Intercept)   1.1349     0.3207   3.539 0.000402 ***
## assort       -3.7358     3.0781  -1.214 0.224862    
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## 
## (Dispersion parameter for binomial family taken to be 1)
## 
##     Null deviance: 67.731  on 64  degrees of freedom
## Residual deviance: 66.177  on 63  degrees of freedom
##   (15 observations deleted due to missingness)
## AIC: 70.177
## 
## Number of Fisher Scoring iterations: 4
reg = glm(isolated ~ assort*percentCoop, 
      data = smallWorld.initial,
      family = binomial(link = "logit"))
summary(reg)
## 
## Call:
## glm(formula = isolated ~ assort * percentCoop, family = binomial(link = "logit"), 
##     data = smallWorld.initial)
## 
## Deviance Residuals: 
##     Min       1Q   Median       3Q      Max  
## -2.5706   0.1873   0.4272   0.6978   1.3591  
## 
## Coefficients:
##                    Estimate Std. Error z value Pr(>|z|)   
## (Intercept)           6.695      2.392   2.799  0.00512 **
## assort              -23.388     22.419  -1.043  0.29684   
## percentCoop          -7.680      3.186  -2.411  0.01593 * 
## assort:percentCoop   25.842     29.451   0.877  0.38024   
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## 
## (Dispersion parameter for binomial family taken to be 1)
## 
##     Null deviance: 67.731  on 64  degrees of freedom
## Residual deviance: 56.386  on 61  degrees of freedom
##   (15 observations deleted due to missingness)
## AIC: 64.386
## 
## Number of Fisher Scoring iterations: 5
reg = glm(percentIsolated ~ coopEnv, 
      data = smallWorld.initial, 
      family = gaussian(link = "identity"))
summary(reg)
## 
## Call:
## glm(formula = percentIsolated ~ coopEnv, family = gaussian(link = "identity"), 
##     data = smallWorld.initial)
## 
## Deviance Residuals: 
##      Min        1Q    Median        3Q       Max  
## -0.12622  -0.05564  -0.02541   0.03834   0.25903  
## 
## Coefficients:
##             Estimate Std. Error t value Pr(>|t|)    
## (Intercept)  0.20852    0.04303   4.846 6.29e-06 ***
## coopEnv     -0.17058    0.06391  -2.669  0.00925 ** 
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## 
## (Dispersion parameter for gaussian family taken to be 0.006957149)
## 
##     Null deviance: 0.59222  on 79  degrees of freedom
## Residual deviance: 0.54266  on 78  degrees of freedom
## AIC: -166.43
## 
## Number of Fisher Scoring iterations: 2
reg = glm(percentIsolated ~ coopEnv*percentCoop, 
      data = smallWorld.initial, 
      family = gaussian(link = "identity"))
summary(reg)
## 
## Call:
## glm(formula = percentIsolated ~ coopEnv * percentCoop, family = gaussian(link = "identity"), 
##     data = smallWorld.initial)
## 
## Deviance Residuals: 
##      Min        1Q    Median        3Q       Max  
## -0.15277  -0.04970  -0.01807   0.03678   0.25172  
## 
## Coefficients:
##                     Estimate Std. Error t value Pr(>|t|)
## (Intercept)           0.1084     0.1925   0.563    0.575
## coopEnv               0.4950     0.3742   1.323    0.190
## percentCoop          -0.2223     0.3692  -0.602    0.549
## coopEnv:percentCoop  -0.3977     0.4417  -0.900    0.371
## 
## (Dispersion parameter for gaussian family taken to be 0.006743275)
## 
##     Null deviance: 0.59222  on 79  degrees of freedom
## Residual deviance: 0.51249  on 76  degrees of freedom
## AIC: -167.01
## 
## Number of Fisher Scoring iterations: 2
reg = glm(percentIsolated ~ assort, 
      data = smallWorld.initial, 
      family = gaussian(link = "identity"))
summary(reg)
## 
## Call:
## glm(formula = percentIsolated ~ assort, family = gaussian(link = "identity"), 
##     data = smallWorld.initial)
## 
## Deviance Residuals: 
##      Min        1Q    Median        3Q       Max  
## -0.13800  -0.04889  -0.01599   0.03676   0.29844  
## 
## Coefficients:
##             Estimate Std. Error t value Pr(>|t|)    
## (Intercept)  0.08136    0.01164   6.988  2.1e-09 ***
## assort      -0.33980    0.09891  -3.435  0.00105 ** 
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## 
## (Dispersion parameter for gaussian family taken to be 0.006992089)
## 
##     Null deviance: 0.52302  on 64  degrees of freedom
## Residual deviance: 0.44050  on 63  degrees of freedom
##   (15 observations deleted due to missingness)
## AIC: -134.16
## 
## Number of Fisher Scoring iterations: 2
reg = glm(percentIsolated ~ assort*percentCoop, 
      data = smallWorld.initial, 
      family = gaussian(link = "identity"))
summary(reg)
## 
## Call:
## glm(formula = percentIsolated ~ assort * percentCoop, family = gaussian(link = "identity"), 
##     data = smallWorld.initial)
## 
## Deviance Residuals: 
##      Min        1Q    Median        3Q       Max  
## -0.13441  -0.04183  -0.01733   0.02556   0.27510  
## 
## Coefficients:
##                    Estimate Std. Error t value Pr(>|t|)    
## (Intercept)         0.22289    0.05970   3.733 0.000418 ***
## assort             -0.70774    0.42639  -1.660 0.102080    
## percentCoop        -0.20362    0.08504  -2.394 0.019731 *  
## assort:percentCoop  0.59881    0.63264   0.947 0.347615    
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## 
## (Dispersion parameter for gaussian family taken to be 0.006108948)
## 
##     Null deviance: 0.52302  on 64  degrees of freedom
## Residual deviance: 0.37265  on 61  degrees of freedom
##   (15 observations deleted due to missingness)
## AIC: -141.04
## 
## Number of Fisher Scoring iterations: 2
# #MSM
# # estimation of denominator of ip weights
# #cooperatorの数以外は全てRandom(Erdos-Renyi random graphにより決まるため)なので、coopEnvはpercentCoopで調整すれば十分か
# den.fit.obj <- lm(coopEnv ~ percentCoop + I(percentCoop^2), data = smallWorld.initial)
# p.den <- predict(den.fit.obj, type = "response")
# dens.den <- dnorm(smallWorld.initial$coopEnv, p.den, summary(den.fit.obj)$sigma)
# 
# # estimation of numerator of ip weights
# num.fit.obj <- lm(coopEnv ~ 1, data = smallWorld.initial)
# p.num <- predict(num.fit.obj, type = "response")
# dens.num <- dnorm(smallWorld.initial$coopEnv, p.num, summary(num.fit.obj)$sigma)
# 
# smallWorld.initial$sw.a = dens.num/dens.den
# summary(smallWorld.initial$sw.a)
# 
# msm.sw.cont <-geepack::geeglm(isolated ~ coopEnv, 
#                  data=smallWorld.initial, weights=sw.a, family = binomial(link="logit"), id=gameID, corstr="independence")
# summary(msm.sw.cont)
# 
# msm.sw.cont <-geepack::geeglm(percentIsolated ~ coopEnv, 
#                  data=smallWorld.initial, weights=sw.a, family = gaussian(link="identity"), id=gameID, corstr="independence")
# summary(msm.sw.cont)


ggplot(data = smallWorld.initial, aes(x = coopEnv, y = percentIsolated)) + 
  geom_point() +
  ggtitle("Percent isolated") +
  scale_x_continuous("Cooporative environment") +  
  scale_y_continuous("Percent of individuals isolated") + 
  scale_fill_continuous(type = "viridis")

ggplot(data = smallWorld.initial, aes(x = assort, y = percentIsolated)) + 
  geom_point() +
  ggtitle("Percent isolated") +
  scale_x_continuous("Assortativity coefficient of initial C/D") +  
  scale_y_continuous("Percent of individuals isolated") + 
  scale_fill_continuous(type = "viridis")
## Warning: Removed 15 rows containing missing values (`geom_point()`).

Simulation 1

All graphs start as Erdos-Renyi random newtorks

Cooperators have low degrees

#Define degrees of isolation
isolationDegree = 2

#number of iterations per arm
iterations = 500

modelForPrediction = "random forest" #"linear" or "random forest"

# List of manipulating parameters of experiments
#L : number of rounds
#V : Visible or not
#A : Income of a rich-group subject
#B : Income of a poor-group subject
#R : Probability to be assigned to a rich group
#I : Number of the same-parameter trial

R = 0.5
I = 0
L = 10


trends.df = data.frame()
  

  
  
for(A in c(1150,700,500)){
  for(V in c(0,1)){
      
      V = V
      A = A
      if(A==1150){B = 200} #high inequality
      if(A==700){B = 300} #low inequality
      if(A==500){B = 500} #no inequality
  
      if(modelForPrediction=="random forest"){
        source(paste(rootdir,"R/models.R",sep="/"))
        if(V==0){
          model1<-model1.invisible(redo=FALSE)
          model2<-model2.invisible(redo=FALSE)
          model3<-model3(redo=FALSE)
          }
        if(V==1){
          model1<-model1.visible(redo=FALSE)
          model2<-model2.visible(redo=FALSE)
          model3<-model3(redo=FALSE)
          }
      }
      
      df.netIntLowDegree = data.frame(
        coopFrac = NULL,
        avgCoop = NULL, 
        avgCoopFinal = NULL, 
        percentIsolation = NULL,
        isolation = NULL,
        percentIsolationC = NULL,
        percentIsolationD = NULL,
        nCommunities = NULL,
        communitySize = NULL,
        assortativityInitial = NULL,
        assortativityFinal = NULL,
        conversionRate = NULL,
        conversionToD = NULL, 
        conversionToC = NULL, 
        transitivity = NULL, 
        degree = NULL, 
        degreeC = NULL, 
        degreeD = NULL,
        meanConversionToD = NULL, 
        meanConversionToC = NULL, 
        degreeLost = NULL,
        degreeLostC = NULL,
        degreeLostD = NULL
      )
  
      #Here, factionCoop=0 will be the control: no rearranging of nodes will take place
      for(frac in c(0,0.25,0.5,0.75,1)){
        #nodes in the top fractionCoop degrees will automatically be a cooperator
        fractionCoop = frac
        
          coopFrac = NULL
          avgCoop = NULL
          homophilyC = NULL
          homophilyD = NULL
          heterophily = NULL
          avgCoopFinal = NULL
          percentIsolation = NULL
          isolation = NULL
          percentIsolationC = NULL
          percentIsolationD = NULL
          nCommunities = NULL
          communitySize = NULL
          assortativityInitial = NULL
          assortativityFinal = NULL
          conversionRate = NULL
          conversionToD = NULL 
          conversionToC = NULL
          transitivity = NULL
          degree = NULL
          degreeC = NULL
          degreeD = NULL
          meanConversionToD = NULL 
          meanConversionToC = NULL
          degreeLost = NULL
          degreeLostC = NULL
          degreeLostD = NULL
          avg_wealth = NULL
          gini = NULL
          for(m in c(1:iterations)){
            # Section 1. NOTES, packages, and Parameters
            #Importing library
            library(igraph) # for network graphing
            library(reldist) # for gini calculatio
            library(boot) # for inv.logit calculation
            #Two prefixed functions
            #rank
            rank1 = function(x) {rank(x,na.last=NA,ties.method="average")[1]} #a smaller value has a smaller rank.
            #gini mean difference (a.k.a. mean difference: please refer to https://stat.ethz.ch/pipermail/r-help/2003-April/032782.html)
            gmd = function(x) {
             x1 = na.omit(x)
             n = length(x1)
            tmp = 0
             for (i in 1:n) {
             for (j in 1:n) {
             tmp <- tmp + abs(x1[i]-x1[j])
             }
             }
            answer = tmp/(n*n)
             return(answer)
            }
        
            
            
            
            # List of fixed parameters of experiments (assumptions)
            #Rewiring rate = 0.3
            #GINI coefficient (can be known by A or B)
            GINI = 0*as.numeric(A==500) + 0.2*as.numeric(A %in% c(700,850)) + 0.4*as.numeric(A ==1150)
            #Collecting data frame (final output data frame)
            result = data.frame(round=0:L,n_par=NA,n_A=NA,avg_coop=NA,avg_degree=NA,avg_wealth=NA,gini=NA,gmd=NA,avg_coop_A=NA,avg_degree_A=NA,avg_wealth_A=NA,gini_A=NA,gmd_A=NA,avg_coop_B=NA,avg_degree_B=NA,avg_wealth_B=NA,gini_B=NA,gmd_B=NA,isolation=NA,percentIsolation=NA,meanConversionToD=NA,meanConversionToC=NA,degreeLost=NA,degreeLostC=NA,degreeLostD=NA)
            #_A is for a richer group and _B is for a poorer group
            
            
            #####################################################
            # Section 1.5: Practice rounds 1 to 2, to determine C/D in round 1
            
            N = 17 # median of the number of participants over rounds.
            node_rp0 = data.frame(ego_id=1:N, round=0)
            node_import = node_rp0
            
            for (k in 1:2){
              node_rX = node_import #Importing data
              node_rX$round = node_rX$round + 1
              node_rX[is.na(node_rX$prev_degree)==1,"prev_degree"] = 0
              node_rX[is.na(node_rX$prev_local_rate_coop)==1,"prev_local_rate_coop"] = 0
              #Only this calculation needs to change from Round 1
              if (k==1) {
                node_rX$prob_coop = inv.logit(1.099471) 
              } else {
                node_rX$prob_coop = inv.logit((-0.02339288) + (1.46068980)*as.numeric(node_rX$prev_coop==1))
              } 
              
              node_rX$coop = apply(data.frame(node_rX$prob_coop),1,function(x) {sample(1:0,1,prob=c(x,(1-x)))})
              
              node_rX$prev_coop = node_rX$coop
                
              assign(paste("coop_rp",k, sep=""),node_rX$coop)
              
              #For the loop
              node_import = node_rX
            }
            
            #cooperation rate in the practice rounds
            coop_rp = apply(cbind(coop_rp1,coop_rp2),1,mean)
      
            #####################################################
            # Section 2: Round 0 (Agents and environments)
            #Node data generation
            N = 17 # median of the number of participants over rounds.
            node_r0 = data.frame(ego_id=1:N, round=0)
            node_r0$coop_rp = ifelse(coop_rp==1,"C","D")
            node_r0$group = sample(c("rich","poor"),N,replace=TRUE,prob=c(R,1-R)) #R is defined as the probability to be assigned to the rich group
            node_r0$initial_wealth = ifelse(node_r0$group=="rich",A,B)
            #Link data generation
            ego_list = NULL
            for (i in 1:N) { ego_list = c(ego_list,rep(i,N)) }
            link_r0 = data.frame(ego_id=ego_list,alt_id=rep(1:N,N))
            link_r0 = link_r0[(link_r0$ego_id < link_r0$alt_id),] #The link was bidirectional, and thus the half and self are omitted.
            link_r0$connected = sample(0:1,dim(link_r0)[1],replace=TRUE,prob=c(0.7,0.3)) #Initial rewiring rate is fixed, 0.3
            link_r0c_ego = link_r0[link_r0$connected==1,]
            link_r0c_alt = link_r0[link_r0$connected==1,]
            colnames(link_r0c_alt) = c("alt_id","ego_id","connected")
            link_r0c = rbind(link_r0c_ego,link_r0c_alt) #this is bidirectional (double counted) for connected ties.
            link_r0c = link_r0c[order(link_r0c$ego_id),]
            link_r0c$alternumber = NA #putting the number for each alter in the same ego
            link_r0c[1,]$alternumber = 1
            for (i in 1:(dim(link_r0c)[1]-1))
              {if (link_r0c[i,]$ego_id == link_r0c[i+1,]$ego_id)
                {link_r0c[i+1,]$alternumber = link_r0c[i,]$alternumber + 1}
              else
                {link_r0c[i+1,]$alternumber = 1}
              #print(i)
              }
            link_r0c2 = reshape(link_r0c, direction = "wide", idvar=c("ego_id","connected"), timevar="alternumber")
            link_r0c2$initial_degree = apply(link_r0c2[,colnames(link_r0c2)[substr(colnames(link_r0c2),1,6) == "alt_id"]],1,function(x){length(na.omit(x))}) #Degree of each ego
            link_r0c2[is.na(link_r0c2$initial_degree)==1,"initial_degree"] = 0
            #Reflect the degree and initial local gini coefficient into the node data
            node_r0 = merge(x=node_r0,y=link_r0c2,all.x=TRUE,all.y=FALSE,by="ego_id")
            node_r0$initial_avg_env_wealth = NA
            node_r0$initial_local_gini = NA #local gini coefficient of the ego and connecting alters
            node_r0$initial_rel_rank = NA #local rank of ego among the ego and connecting alters (divided by the number of the go and connecting alters)
            for (i in 1:(dim(node_r0)[1])){
              node_r0[i,]$initial_avg_env_wealth = mean(na.omit(node_r0[node_r0$ego_id %in%
              node_r0[i,colnames(node_r0)[substr(colnames(node_r0),1,6) %in% c("ego_id","alt_id")]],"initial_wealth"]))
              node_r0[i,]$initial_local_gini = gini(na.omit(node_r0[node_r0$ego_id %in% node_r0[i,colnames(node_r0)[substr(colnames(node_r0),1,6)
              %in% c("ego_id","alt_id")]],"initial_wealth"]))
              node_r0[i,]$initial_rel_rank = rank1(na.omit(node_r0[node_r0$ego_id %in% node_r0[i,colnames(node_r0)[substr(colnames(node_r0),1,6)
              %in% c("ego_id","alt_id")]],"initial_wealth"]))/length(na.omit(node_r0[node_r0$ego_id %in%
              node_r0[i,colnames(node_r0)[substr(colnames(node_r0),1,6) %in% c("ego_id","alt_id")]],"initial_wealth"]))
              }
            #Finalization of round 0 and Visualization
            #plot(graph.data.frame(link_r0[link_r0$connected==1,],directed=F)) #plot.igraph
            node_r0$everIsolated = 0
            node_r0$maxDegreeLost = NA
            result[result$round==0,2:25] = c(length(node_r0$ego_id),length(node_r0[node_r0$group=="rich",]$ego_id),NA,mean(node_r0$initial_degree),mean(node_r0$initial_wealth),gini(node_r0$initial_wealth),gmd(node_r0$initial_wealth),NA,mean(node_r0[node_r0$group=="rich",]$initial_degree),mean(node_r0[node_r0$group=="rich",]$initial_wealth),gini(node_r0[node_r0$group=="rich",]$initial_wealth),gmd(node_r0[node_r0$group=="rich",]$initial_wealth),NA,mean(node_r0[node_r0$group=="poor",]$initial_degree),mean(node_r0[node_r0$group=="poor",]$initial_wealth),gini(node_r0[node_r0$group=="poor",]$initial_wealth),gmd(node_r0[node_r0$group=="poor",]$initial_wealth),
                                             as.numeric(ifelse(is.na(table(node_r0$initial_degree<=isolationDegree)["TRUE"]),0,1)),
                                             as.numeric(sum(node_r0$everIsolated)/length(node_r0$ego_id)),
                                             NA,
                                             NA,
                                             NA,NA,NA
                                             )
            
            g_r0 = graph_from_data_frame(link_r0[link_r0$connected==1,][1:2], directed = FALSE, vertices=node_r0)
            node_r0$prev_betweenness = betweenness(g_r0)
            
            #For the loop at the next round (for round 1, the initial one is the same as the previous [1 prior] one)
            node_import = node_r0
            node_import$initial_coop = NA
            node_import$prev_coop = NA
            node_import$prev_wealth = node_import$initial_wealth
            node_import$prev_degree = node_import$initial_degree
            node_import$prev_avg_env_wealth = node_import$initial_avg_env_wealth
            node_import$prev_local_gini = node_import$initial_local_gini
            node_import$prev_rel_rank = node_import$initial_rel_rank
            node_import$prev_local_rate_coop = NA
            link_import = link_r0
            
            
            
            #####################################################
            # Section 3: Rounds 1 to 10 or more (behaviors in simulation: the equation of cooperation is different at round 1 because of no history)
            #3-1: Cooperation phase
            for (k in 1:L)
            {
              node_rX = node_import #Importing data
              node_rX$round = node_rX$round + 1
              node_rX[is.na(node_rX$prev_degree)==1,"prev_degree"] = 0
              node_rX[is.na(node_rX$prev_betweenness)==1,"prev_betweenness"] = 0
              node_rX[is.na(node_rX$prev_local_rate_coop)==1,"prev_local_rate_coop"] = 0
              #Only this calculation needs to change from Round 1
              if(modelForPrediction=="linear"){
                if (k==1) {
                  node_rX$prob_coop = as.numeric(V==0)*inv.logit((-1.816665) + (2.086067)*coop_rp1 + (1.800153)*coop_rp2) + as.numeric(V==1)*inv.logit((-2.031577) + (2.427157)*coop_rp1 + (1.684193)*coop_rp2 + (-1.528851)*GINI)
                  } else {
                  node_rX$prob_coop = as.numeric(V==0 & node_rX$prev_coop==0)*inv.logit(-1.039916) + as.numeric(V==0 & node_rX$prev_coop==1)*inv.logit(2.062023) + as.numeric(V==1 & node_rX$prev_coop==0)*inv.logit((-0.2574838)*as.numeric(node_rX$prev_avg_env_wealth - node_rX$prev_wealth > 0) + (-1.214198)*GINI + (2.508148)*GINI*as.numeric(node_rX$prev_avg_env_wealth - node_rX$prev_wealth > 0) + (-0.9749075)) + as.numeric(V==1 & node_rX$prev_coop==1)*inv.logit((- 0.6197254)*as.numeric(node_rX$prev_avg_env_wealth - node_rX$prev_wealth > 0) + (-0.7480261)*GINI + (1.169674)*GINI*as.numeric(node_rX$prev_avg_env_wealth - node_rX$prev_wealth > 0) + (1.356784))
                  } 
              }
              if(modelForPrediction=="random forest"){
                if (k==1) {
                    if(V==1){node_rX$prob_coop = predict(model1,
                                                         newdata=
                                                           data.frame(
                                                             behavior.p1 = coop_rp1,
                                                             behavior.p2 = coop_rp2,
                                                             gini = GINI
                                                           ),
                                                         type = "prob"
                                                         )[[1]]$C}
                    else if(V==0){node_rX$prob_coop = predict(model1,
                                                         newdata=
                                                           data.frame(
                                                             behavior.p1 = coop_rp1,
                                                             behavior.p2 = coop_rp2
                                                           ),
                                                         type = "prob"
                                                         )[[1]]$C}
                  } else {
                    if(V==1){node_rX$prob_coop = predict(model2,
                                                         newdata=
                                                           data.frame(
                                                             prevCoop = node_rX$prev_coop,
                                                             gini = GINI,
                                                             alterPrevWealth = node_rX$prev_avg_env_wealth,
                                                             egoPrevWealth = node_rX$prev_wealth
                                                           ),
                                                         type = "prob"
                                                         )[[1]]$C}
                    else if(V==0){node_rX$prob_coop = predict(model2,
                                                         newdata=
                                                           data.frame(
                                                             prevCoop = node_rX$prev_coop,
                                                             alterPrevWealth = node_rX$prev_avg_env_wealth,
                                                             egoPrevWealth = node_rX$prev_wealth
                                                           ),
                                                         type = "prob"
                                                         )[[1]]$C}
                  }
              }
              #####rearrange node degrees before round 1 depending on cooperation in practice rounds!
              if(k==1){
                if(fractionCoop==0){
                  node_rX$prob_coop
                  node_rX$coop = apply(data.frame(node_rX$prob_coop),1,function(x) {sample(1:0,1,prob=c(x,(1-x)))})
                  coop_rp_init = coop_rp
                  }
                if(fractionCoop>0){
                  prob_coop_df = NULL
                  nodesCoop = NULL
                  #nodesCoop = node_rX$prev_degree<=quantile(node_rX$prev_degree,fractionCoop) #assign low-betweenness centrality nodes to cooperators
                  #assign defectors to designated nodes
                  
                  if(fractionCoop<1){nodesCoop = node_rX$prev_betweenness<quantile(node_rX$prev_betweenness,fractionCoop) & node_rX$prev_betweenness>=quantile(node_rX$prev_betweenness,fractionCoop-0.25)}
                  else if(fractionCoop==1){nodesCoop = node_rX$prev_betweenness<=quantile(node_rX$prev_betweenness,fractionCoop) & node_rX$prev_betweenness>=quantile(node_rX$prev_betweenness,fractionCoop-0.25)}
                  prob_coop_df = 
                    data.frame(
                      prob_coop = rev(node_rX$prob_coop[order(coop_rp)]),
                      node_number = c(which(!nodesCoop),which(nodesCoop))
                    )
                  node_rX$prob_coop = prob_coop_df[order(prob_coop_df$node_number),]$prob_coop
                  #coop_rp of the rearranged nodes
                  coop_rp_init = rev(coop_rp[order(coop_rp)])[order(prob_coop_df$node_number)]
                  node_rX$coop = apply(data.frame(node_rX$prob_coop),1,function(x) {sample(1:0,1,prob=c(x,(1-x)))})
                }
              } else {
                node_rX$coop = apply(data.frame(node_rX$prob_coop),1,function(x) {sample(1:0,1,prob=c(x,(1-x)))})
              }
              if (k==1) {
                node_rX$initial_coop = node_rX$coop
                } else {
                node_rX$initial_coop = node_rX$initial_coop
                }
              node_rX$cost = (-50)*node_rX$coop*node_rX$prev_degree
              node_rX$n_coop_received = NA
              for (i in 1:(dim(node_rX)[1]))
                {
                node_rX[i,]$n_coop_received = sum(node_rX[node_rX$ego_id %in% node_rX[i,colnames(node_rX)[substr(colnames(node_rX),1,6) ==
                "alt_id"]],"coop"])
                }
              node_rX$benefit = 100*node_rX$n_coop_received
              node_rX$payoff = node_rX$cost + node_rX$benefit
              node_rX$wealth = node_rX$prev_wealth + node_rX$payoff
              node_rX$rel_rank = NA
              node_rX$local_rate_coop = NA
              for (i in 1:dim(node_rX)[1])
                {
                node_rX[i,]$rel_rank = rank1(na.omit(node_rX[node_rX$ego_id %in% node_rX[i,colnames(node_rX)[substr(colnames(node_rX),1,6) %in%
                c("ego_id","alt_id")]],"wealth"]))/length(na.omit(node_rX[node_rX$ego_id %in%
                node_rX[i,colnames(node_rX)[substr(colnames(node_rX),1,6) %in% c("ego_id","alt_id")]],"wealth"]))
                node_rX[i,]$local_rate_coop = mean(na.omit(node_rX[node_rX$ego_id %in% node_rX[i,colnames(node_rX)[substr(colnames(node_rX),1,6) %in%
                c("ego_id","alt_id")]],"coop"]))
                }
              node_rX$growth = as.numeric((node_rX$wealth/node_rX$prev_wealth) > 1)
              node_rX = node_rX[,c("ego_id","round","group","prev_degree","initial_wealth","initial_local_gini","initial_coop","coop","wealth","rel_rank","local_rate_coop","growth","everIsolated","maxDegreeLost")] #Pruning the previous-round data (degree is not updating yet)
              
              #3-2: Rewiring phase
              # 30% of ties (unidirectional) are being rewired
              link_rX_1 = link_import #Importing data (bidirectioanl ego-alter [ego_id < alter_id])
              colnames(link_rX_1) = c("ego_id","alt_id","prev_connected")
              link_rX_1$challenge = sample(0:1,dim(link_rX_1)[1],replace=TRUE,prob=c(0.7,0.3)) # The bidirectional ties being rewired are selected (rewiring rate = 0.3).
              ego_node_data =
              node_rX[,c("ego_id","wealth","coop","prev_degree","initial_wealth","initial_local_gini","initial_coop","rel_rank","local_rate_coop","growth")]
              colnames(ego_node_data) =
              c("ego_id","ego_wealth","ego_coop","ego_prev_degree","ego_initial_wealth","ego_initial_local_gini","ego_initial_coop","ego_rel_rank","ego_local_rate_coop","ego_growth")
              alt_node_data =
              node_rX[,c("ego_id","wealth","coop","prev_degree","initial_wealth","initial_local_gini","initial_coop","rel_rank","local_rate_coop","growth")]
              colnames(alt_node_data) =
              c("alt_id","alt_wealth","alt_coop","alt_prev_degree","alt_initial_wealth","alt_initial_local_gini","alt_initial_coop","alt_rel_rank","alt_local_rate_coop","alt_growth")
              link_rX_2 = merge(x=link_rX_1,y=ego_node_data,all.x=TRUE,all.y=FALSE,by="ego_id")
              link_rX_3 = merge(x=link_rX_2,y=alt_node_data,all.x=TRUE,all.y=FALSE,by="alt_id")
              link_rX_3$choice = sample(c("ego","alt"),dim(link_rX_3)[1],replace=TRUE,prob=c(0.5,0.5)) #decision maker for breaking a link, which is a unilateral decision
              #ego_prob: probability of choosing to connect when challenged (asked)
              
              if(modelForPrediction=="linear"){
                link_rX_3$ego_prob = inv.logit((0.5134401)*link_rX_3$prev_connected + (-0.852406)*link_rX_3$ego_coop + (2.96549)*link_rX_3$alt_coop + (-0.1808545))
                link_rX_3$alt_prob = inv.logit((0.5134401)*link_rX_3$prev_connected + (-0.852406)*link_rX_3$alt_coop + (2.96549)*link_rX_3$ego_coop + (-0.1808545))}
              if(modelForPrediction=="random forest"){
                link_rX_3$ego_prob = predict(model3,
                                             newdata=
                                               data.frame(
                                                 previouslyconnected = link_rX_3$prev_connected,
                                                 ego_behavior = link_rX_3$ego_coop,
                                                 alter_behavior = link_rX_3$alt_coop
                                                 ),
                                            type = "prob"
                                             )[[1]]$C
                link_rX_3$alt_prob = predict(model3,
                                             newdata=
                                               data.frame(
                                                 previouslyconnected = link_rX_3$prev_connected,
                                                 ego_behavior = link_rX_3$alt_coop,
                                                 alter_behavior = link_rX_3$ego_coop
                                                 ),
                                            type = "prob"
                                             )[[1]]$C
              }
              link_rX_3$prob_connect = ifelse(link_rX_3$prev_connected == 1, ifelse(link_rX_3$choice == "ego", link_rX_3$ego_prob,
              link_rX_3$alt_prob), link_rX_3$ego_prob*link_rX_3$alt_prob)
              link_rX_3$connect_update = apply(data.frame(link_rX_3$prob_connect),1, function(x) {sample(1:0,1,prob=c(x,(1-x)))})
              link_rX_3$connected = ifelse(link_rX_3$challenge==0,link_rX_3$prev_connected,link_rX_3$connect_update)
              link_rX = link_rX_3[,c("ego_id","alt_id","connected")] #pruning and data is updated
              #Reflect the degree and local gini coefficient into the node data
              link_rXc_ego = link_rX[link_rX$connected==1,]
              link_rXc_alt = link_rX[link_rX$connected==1,]
              colnames(link_rXc_alt) = c("alt_id","ego_id","connected")
              link_rXc = rbind(link_rXc_ego,link_rXc_alt)
              link_rXc = link_rXc[order(link_rXc$ego_id),]
              link_rXc$alternumber = NA
              link_rXc[1,]$alternumber = 1
              for (i in 1:(dim(link_rXc)[1]-1))
                {
                  if (link_rXc[i,]$ego_id == link_rXc[i+1,]$ego_id)
                  {
                  link_rXc[i+1,]$alternumber = link_rXc[i,]$alternumber + 1
                  }
                  else
                  {
                  link_rXc[i+1,]$alternumber = 1
                  }
                  #print(i)
                }
              link_rXc2 = reshape(link_rXc, direction = "wide", idvar=c("ego_id","connected"), timevar="alternumber")
              link_rXc2$degree = apply(link_rXc2[,colnames(link_rXc2)[substr(colnames(link_rXc2),1,3) == "alt"]],1,function(x) {length(na.omit(x))})
              node_rX_final = merge(x=node_rX[,c("ego_id","round","group","initial_wealth","initial_local_gini","initial_coop","coop","wealth","growth","everIsolated","maxDegreeLost")],y=link_rXc2,all.x=TRUE,all.y=FALSE,by="ego_id")
              node_rX_final[is.na(node_rX_final$degree)==1,"degree"] = 0
              node_rX_final$avg_env_wealth = NA
              node_rX_final$local_gini = NA #needs to be updated because the social network changes at the rewiring phase
              node_rX_final$local_rate_coop = NA
              node_rX_final$rel_rank = NA
              for (i in 1:dim(node_rX_final)[1])
                {
                node_rX_final[i,]$avg_env_wealth = mean(na.omit(node_rX_final[node_rX_final$ego_id %in%
                node_rX_final[i,colnames(node_rX_final)[substr(colnames(node_rX_final),1,6) %in% c("ego_id","alt_id")]],"wealth"]))
                node_rX_final[i,]$local_gini = gini(na.omit(node_rX_final[node_rX_final$ego_id %in%
                node_rX_final[i,colnames(node_rX_final)[substr(colnames(node_rX_final),1,6) %in% c("ego_id","alt_id")]],"wealth"]))
                node_rX_final[i,]$local_rate_coop = mean(na.omit(node_rX_final[node_rX_final$ego_id %in%
                node_rX_final[i,colnames(node_rX_final)[substr(colnames(node_rX_final),1,6) %in% c("ego_id","alt_id")]],"coop"]))
                node_rX_final[i,]$rel_rank = rank1(na.omit(node_rX_final[node_rX_final$ego_id %in%
                node_rX_final[i,colnames(node_rX_final)[substr(colnames(node_rX_final),1,6) %in%
                c("ego_id","alt_id")]],"wealth"]))/length(na.omit(node_rX_final[node_rX_final$ego_id %in%
                node_rX_final[i,colnames(node_rX_final)[substr(colnames(node_rX_final),1,6) %in% c("ego_id","alt_id")]],"wealth"]))
                node_rX_final[i,]$everIsolated = ifelse(node_rX_final[i,]$everIsolated==1,1,ifelse(node_rX_final[i,]$degree<=isolationDegree,1,0))
                node_rX_final[i,]$maxDegreeLost = pmax(node_r0[i,]$initial_degree - node_rX_final[i,]$degree, node_rX_final[i,]$maxDegreeLost, na.rm=TRUE)
              }
              
              
              #Finalization of round X and Visualization
              #plot(graph.data.frame(link_rX[link_rX$connected==1,],directed=F)) #plot.igraph
              result[result$round==k,2:25] =
              c(length(node_rX_final$ego_id),length(node_rX_final[node_rX_final$group=="rich",]$ego_id),mean(node_rX_final$coop),mean(node_rX_final$degree),mean(node_rX_final$wealth),gini(node_rX_final$wealth),gmd(node_rX_final$wealth),mean(node_rX_final[node_rX_final$group=="rich",]$coop),mean(node_rX_final[node_rX_final$group=="rich",]$degree),mean(node_rX_final[node_rX_final$group=="rich",]$wealth),gini(node_rX_final[node_rX_final$group=="rich",]$wealth),gmd(node_rX_final[node_rX_final$group=="rich",]$wealth),mean(node_rX_final[node_rX_final$group=="poor",]$coop),mean(node_rX_final[node_rX_final$group=="poor",]$degree),mean(node_rX_final[node_rX_final$group=="poor",]$wealth),gini(node_rX_final[node_rX_final$group=="poor",]$wealth),gmd(node_rX_final[node_rX_final$group=="poor",]$wealth),
                                             as.numeric(ifelse(is.na(table(node_rX_final$degree<=isolationDegree)["TRUE"]),0,1)),
                                             as.numeric(sum(node_rX_final$everIsolated)/length(node_rX_final$ego_id)),
                prop.table(table(node_rX_final[node_rX_final$initial_coop==1]$coop))["0"],
                prop.table(table(node_rX_final[node_rX_final$initial_coop==0]$coop))["1"],
                suppressWarnings({mean(node_rX_final$maxDegreeLost,na.rm=TRUE)}),
                suppressWarnings({mean(node_rX_final[node_rX_final$initial_coop==1]$maxDegreeLost,na.rm=TRUE)}),
                suppressWarnings({mean(node_rX_final[node_rX_final$initial_coop==0]$maxDegreeLost,na.rm=TRUE)})
                )
              
              #For the loop
              node_import = node_rX_final
              colnames(node_import)[colnames(node_import) %in%
              c("coop","wealth","growth","degree","avg_env_wealth","local_gini","local_rate_coop","rel_rank")] =
              c("prev_coop","prev_wealth","prev_growth","prev_degree","prev_avg_env_wealth","prev_local_gini","prev_local_rate_coop","prev_rel_rank")
              link_import = link_rX
              #print(paste0("Round ",k," is done."))
              g_rX = graph_from_data_frame(link_rX[link_rX$connected==1,][1:2], directed = FALSE, vertices=node_rX_final)
              node_import$prev_betweenness = betweenness(g_rX)
            
            }
            
           
            trends.df = rbind(trends.df,cbind(result[c("round","gini","gmd","avg_wealth","avg_coop","avg_degree")],V,GINI,fractionCoop))
            
            link_rX_final = data.table::melt(setDT(node_rX_final),
                                     measure = patterns('alt_id'),
                                     variable.name = 'linkNumber', 
                                     value.name = c('alt_id'))
            link_rX_final = data.frame(link_rX_final)[c("ego_id","alt_id")]
            link_rX_final = link_rX_final[complete.cases(link_rX_final),]
            link_rX_final = data.frame(t(unique(apply(link_rX_final, 1, function(x) sort(x))))) %>% distinct(X1, X2)
            node_g_final = data.frame(node_rX_final)[c("ego_id","initial_coop","coop")]
            node_g_final$initial_coop = factor(node_g_final$initial_coop)
            
            g_rX_final = graph_from_data_frame(link_rX_final, directed = FALSE, vertices=node_g_final)
            g_r0 = graph_from_data_frame(link_r0[link_r0$connected==1,][1:2], directed = FALSE, vertices=node_r0)
            
            E(g_r0)$coopEdgeC = sapply(E(g_r0), function(e) prod(ifelse(V(g_r0)[inc(e)]$coop_rp=="C",1,0)))
            E(g_r0)$coopEdgeD = sapply(E(g_r0), function(e) prod(ifelse(V(g_r0)[inc(e)]$coop_rp=="D",1,0)))
            E(g_r0)$coopEdgeCD = sapply(E(g_r0), function(e) ifelse(sum(ifelse(V(g_r0)[inc(e)]$coop_rp=="C",1,0))==1,1,0))
            
            #C-assortativity, defined as number of observed C-C edges out of total possible C-C edges
            homophilyC[m] = sum(E(g_r0)$coopEdgeC) / (table(V(g_r0)$coop_rp)["C"]*(table(V(g_r0)$coop_rp)["C"]-1)/2)
            #D-assortativity, defined as number of observed C-C edges out of total possible C-C edges
            homophilyD[m] = sum(E(g_r0)$coopEdgeD) / (table(V(g_r0)$coop_rp)["D"]*(table(V(g_r0)$coop_rp)["D"]-1)/2)
            #heterophily, defined as number of observed C-D edges out of total possible C-D edges
            heterophily[m] = sum(E(g_r0)$coopEdgeCD) / (table(V(g_r0)$coop_rp)["C"]*table(V(g_r0)$coop_rp)["D"])
            
            coopFrac[m] = fractionCoop
            avgCoop[m] = prop.table(table(V(g_r0)$coop_rp))["C"]
            avgCoopFinal[m] = result[result$round==10,]$avg_coop
            percentIsolation[m] = max(result[result$round>=1,]$percentIsolation)
            isolation[m] = max(result[result$round>=1,]$isolation)
            #percentage of isolation among those who cooperated in both practice rounds
            percentIsolationC[m] = sum(node_rX_final[coop_rp_init==1,]$everIsolated)/length(node_rX_final[coop_rp_init==1,]$everIsolated)
            #percentage of isolation among those who defected at least once in practice rounds
            percentIsolationD[m] = sum(node_rX_final[coop_rp_init<=0.5,]$everIsolated)/length(node_rX_final[coop_rp_init<=0.5,]$everIsolated)
            
            nCommunities[m] = max(membership(cluster_louvain(g_rX_final)),na.rm=TRUE)
            communitySize[m] = mean(table(membership(cluster_louvain(g_rX_final))),na.rm=TRUE)
            assortativityInitial[m] = assortativity(g_r0, V(g_r0)$coop_rp == "C")
            assortativityFinal[m] = assortativity(g_rX_final, V(g_r0)$coop_rp == "C")
            conversionRate[m] = prop.table(table(V(g_rX_final)$coop == ifelse(V(g_r0)$coop_rp=="C","1","0")))["FALSE"]
            conversionToD[m] = prop.table(table(V(g_rX_final)$coop[V(g_r0)$coop_rp == "C"]))["0"]
            conversionToC[m] = prop.table(table(V(g_rX_final)$coop[V(g_r0)$coop_rp == "C"]))["1"]
            transitivity[m] = mean(transitivity(g_rX_final, type="global"),na.rm=TRUE)
            degree[m] = mean(igraph::degree(g_rX_final),na.rm=TRUE)
            degreeC[m] = mean(igraph::degree(g_r0)[coop_rp_init==1],na.rm=TRUE)
            degreeD[m] = mean(igraph::degree(g_r0)[coop_rp_init<=0.5],na.rm=TRUE)
            meanConversionToD[m] = mean(result[result$round>=2,]$meanConversionToD, na.rm=TRUE)
            meanConversionToC[m] = mean(result[result$round>=2,]$meanConversionToC, na.rm=TRUE)
            degreeLost[m] = result[result$round==10,]$degreeLost
            degreeLostC[m] = result[result$round==10,]$degreeLostC
            degreeLostD[m] = result[result$round==10,]$degreeLostD
            avg_wealth[m] = result[result$round==10,]$avg_wealth
            gini[m] = result[result$round==10,]$gini
        
          }
          
        df.netIntLowDegree = rbind(df.netIntLowDegree,
                          data.frame(
                            coopFrac = coopFrac,
                            avgCoop = avgCoop,
                            avgCoopFinal = avgCoopFinal,
                            percentIsolation = percentIsolation,
                            isolation = isolation,
                            percentIsolationC = percentIsolationC,
                            percentIsolationD = percentIsolationD,
                            nCommunities = nCommunities,
                            communitySize = communitySize,
                            assortativityInitial = assortativityInitial,
                            assortativityFinal = assortativityFinal,
                            conversionRate = conversionRate,
                            conversionToD = conversionToD, 
                            conversionToC = conversionToC, 
                            homophilyC = homophilyC,
                            homophilyD = homophilyD,
                            heterophily = heterophily,
                            transitivity = transitivity, 
                            degree = degree, 
                            degreeC = degreeC, 
                            degreeD = degreeD,
                            meanConversionToD = meanConversionToD, 
                            meanConversionToC = meanConversionToC,
                            degreeLost = degreeLost,
                            degreeLostC = degreeLostC,
                            degreeLostD = degreeLostD,
                            avg_wealth = avg_wealth,
                            gini = gini
                            ))
        #plot(g_r0,vertex.color=V(g_rX_final)$initial_coop,vertex.label=ifelse(is.na(V(g_rX_final)$initial_coop),"NA",ifelse(V(g_rX_final)$initial_coop==1,"C","D")),main=paste("fracCoop=",frac,", round 0",sep=""))
        #plot(g_rX_final,vertex.color=V(g_rX_final)$initial_coop,vertex.label=ifelse(is.na(V(g_rX_final)$initial_coop),"NA",ifelse(V(g_rX_final)$initial_coop==1,"C","D")),main=paste("fracCoop=",frac,", final round",sep=""))
        
      }
      
    sum.netIntLowDegree <- data.frame(
      df.netIntLowDegree %>% 
        group_by(coopFrac) %>%
          summarise(
            mean.isolation = mean(isolation),
            ci.isolation   = 1.96 * sd(isolation)/sqrt(n()),
            mean.percentIsolation = mean(percentIsolation),
            ci.percentIsolation   = 1.96 * sd(percentIsolation)/sqrt(n()),
            mean.percentIsolationC = mean(percentIsolationC,na.rm=TRUE),
            ci.percentIsolationC   = 1.96 * sd(percentIsolationC,na.rm=TRUE)/sqrt(sum(isolation)),
            mean.percentIsolationD = mean(percentIsolationD,na.rm=TRUE),
            ci.percentIsolationD   = 1.96 * sd(percentIsolationD,na.rm=TRUE)/sqrt(sum(isolation)),
            mean.avgCoop = mean(avgCoop,na.rm=TRUE),
            ci.avgCoop   = 1.96 * sd(avgCoop,na.rm=TRUE)/sqrt(n()),
            mean.avgCoopFinal = mean(avgCoopFinal,na.rm=TRUE),
            ci.avgCoopFinal   = 1.96 * sd(avgCoopFinal,na.rm=TRUE)/sqrt(n()),
            mean.nCommunities = mean(nCommunities,na.rm=TRUE),
            ci.nCommunities   = 1.96 * sd(nCommunities,na.rm=TRUE)/sqrt(n()),
            mean.communitySize = mean(communitySize,na.rm=TRUE),
            ci.communitySize   = 1.96 * sd(communitySize,na.rm=TRUE)/sqrt(n()),
            mean.assortativityInitial = mean(assortativityInitial,na.rm=TRUE),
            ci.assortativityInitial   = 1.96 * sd(assortativityInitial,na.rm=TRUE)/sqrt(n()),
            mean.assortativityFinal = mean(assortativityFinal,na.rm=TRUE),
            ci.assortativityFinal   = 1.96 * sd(assortativityFinal,na.rm=TRUE)/sqrt(n()),
            mean.conversionRate = mean(conversionRate,na.rm=TRUE),
            ci.conversionRate   = 1.96 * sd(conversionRate,na.rm=TRUE)/sqrt(n()),
            mean.conversionToD = mean(conversionToD,na.rm=TRUE),
            ci.conversionToD   = 1.96 * sd(conversionToD,na.rm=TRUE)/sqrt(n()),
            mean.conversionToC = mean(conversionToC,na.rm=TRUE),
            ci.conversionToC   = 1.96 * sd(conversionToC,na.rm=TRUE)/sqrt(n()),
            mean.homophilyC = mean(homophilyC,na.rm=TRUE),
            ci.homophilyC   = 1.96 * sd(homophilyC,na.rm=TRUE)/sqrt(n()),
            mean.homophilyD = mean(homophilyD,na.rm=TRUE),
            ci.homophilyD   = 1.96 * sd(homophilyD,na.rm=TRUE)/sqrt(n()),
            mean.heterophily = mean(heterophily,na.rm=TRUE),
            ci.heterophily   = 1.96 * sd(heterophily,na.rm=TRUE)/sqrt(n()),
            mean.transitivity = mean(transitivity,na.rm=TRUE),
            ci.transitivity   = 1.96 * sd(transitivity,na.rm=TRUE)/sqrt(n()),
            mean.degree = mean(degree,na.rm=TRUE),
            ci.degree   = 1.96 * sd(degree,na.rm=TRUE)/sqrt(n()),
            mean.degreeC = mean(degreeC,na.rm=TRUE),
            ci.degreeC   = 1.96 * sd(degreeC,na.rm=TRUE)/sqrt(n()),
            mean.degreeD = mean(degreeD,na.rm=TRUE),
            ci.degreeD   = 1.96 * sd(degreeD,na.rm=TRUE)/sqrt(n()),
            mean.meanConversionToD = mean(meanConversionToD,na.rm=TRUE),
            ci.meanConversionToD   = 1.96 * sd(meanConversionToD,na.rm=TRUE)/sqrt(n()),
            mean.meanConversionToC = mean(meanConversionToC,na.rm=TRUE),
            ci.meanConversionToC   = 1.96 * sd(meanConversionToC,na.rm=TRUE)/sqrt(n()),
            mean.degreeLost = mean(degreeLost,na.rm=TRUE),
            ci.degreeLost   = 1.96 * sd(degreeLost,na.rm=TRUE)/sqrt(n()),
            mean.degreeLostC = mean(degreeLostC,na.rm=TRUE),
            ci.degreeLostC   = 1.96 * sd(degreeLostC,na.rm=TRUE)/sqrt(n()),
            mean.degreeLostD = mean(degreeLostD,na.rm=TRUE),
            ci.degreeLostD   = 1.96 * sd(degreeLostD,na.rm=TRUE)/sqrt(n()),
            mean.avg_wealth = mean(avg_wealth,na.rm=TRUE),
            ci.avg_wealth   = 1.96 * sd(avg_wealth,na.rm=TRUE)/sqrt(n()),
            mean.gini = mean(gini,na.rm=TRUE),
            ci.gini   = 1.96 * sd(gini,na.rm=TRUE)/sqrt(n())
            )
      )
          
    kable(sum.netIntLowDegree[c(1:9)]) %>% kableExtra::kable_styling(font_size = 10)
    kable(sum.netIntLowDegree[c(1,10:17)]) %>% kableExtra::kable_styling(font_size = 10) 
    kable(sum.netIntLowDegree[c(1,18:25)]) %>% kableExtra::kable_styling(font_size = 10) 
    kable(sum.netIntLowDegree[c(1,26:33)]) %>% kableExtra::kable_styling(font_size = 10) 
    kable(sum.netIntLowDegree[c(1,34:ncol(sum.netIntLowDegree))]) %>% kableExtra::kable_styling(font_size = 10) 
    
    compare_means(percentIsolation ~ coopFrac, data=df.netIntLowDegree)
    compare_means(avgCoop ~ coopFrac, data=df.netIntLowDegree)
    compare_means(avgCoopFinal ~ coopFrac, data=df.netIntLowDegree)
    compare_means(nCommunities ~ coopFrac, data=df.netIntLowDegree)
    compare_means(communitySize ~ coopFrac, data=df.netIntLowDegree)
    compare_means(assortativityInitial ~ coopFrac, data=df.netIntLowDegree)
    compare_means(assortativityFinal ~ coopFrac, data=df.netIntLowDegree)
    #compare_means(conversionRate ~ coopFrac, data=df.netIntLowDegree)
    #compare_means(conversionToD ~ coopFrac, data=df.netIntLowDegree)
    #compare_means(conversionToC ~ coopFrac, data=df.netIntLowDegree)
    #compare_means(degreeC ~ coopFrac, data=df.netIntLowDegree)
    #compare_means(degreeD ~ coopFrac, data=df.netIntLowDegree)
    #compare_means(meanConversionToD ~ coopFrac, data=df.netIntLowDegree)
    #compare_means(meanConversionToC ~ coopFrac, data=df.netIntLowDegree)
    #compare_means(degreeLost ~ coopFrac, data=df.netIntLowDegree)
    #compare_means(degreeLostC ~ coopFrac, data=df.netIntLowDegree)
    #compare_means(degreeLostD ~ coopFrac, data=df.netIntLowDegree)
    
    summary(lm(percentIsolation ~ assortativityInitial, data=df.netIntLowDegree))
    
    #plot(df.netIntLowDegree$assortativityInitial, df.netIntLowDegree$percentIsolation)
    
    
    
    #percentIsolation
    g.percentIsolation = ggbarplot(data=df.netIntLowDegree, x="coopFrac", y="percentIsolation", add = "mean_se", color="coopFrac") +
      stat_compare_means(ref.group = "0", label = "p.signif", label.y = 0.098, method="t.test", color="black") +  
      labs(
        title = paste("Isolation when defectors are assigned to 25% of nodes by degree, ","V=",V,", Gini=",GINI,sep=""),
        x = "Betweenness centrality percentile of nodes assigned to defectors ",
        y = "Propoption of ever-isolated individuals") +
      annotate("text", x=1, y=0.0990, label= "ref", color="black") +
      annotate("text", x=2.4, y= -0.0022, label= "Lowest degree nodes assigned to defectors", size=2.5) +
      geom_segment(aes(x = 3.3, y = -0.0024, xend = 3.7, yend = -0.0024), linewidth=0.2, arrow = arrow(length = unit(0.1, "cm"))) +
      annotate("text", x=4.6, y= -0.0022, label= "Highest degree nodes assigned to defectors", size=2.5) +
      theme_bw() +
      theme(plot.title = element_text(hjust = 0.5, size=12),legend.position="none") +
      coord_cartesian(ylim=c(0,0.10)) + 
      scale_x_discrete(labels=c('Control','0-25','25-50','50-75','75-100')) +
      scale_color_manual(values = c('0' = "black",'0.25'="black",'0.5'="black",'0.75'="black",'1'="black")) +
      geom_vline(xintercept = 1.5, linetype = "longdash")
    print(g.percentIsolation)
    
    #percentIsolationC
    #percentage of isolation among those who cooperated in both practice rounds
    g.percentIsolationC = ggbarplot(data=df.netIntLowDegree, x="coopFrac", y="percentIsolationC", add = "mean_se") +
      stat_compare_means(ref.group = "0", label = "p.signif", label.y = 0.098, method="t.test", color="black") +  
      labs(
        title = paste("Isolation among initial cooperators, ","V=",V,", Gini=",GINI,sep=""),
        x = "Betweenness centrality percentile of nodes assigned to defectors ",
        y = "Propoption of ever-isolated individuals") +
      annotate("text", x=1, y=0.0990, label= "ref", color="black") +
      annotate("text", x=2.4, y= -0.0022, label= "Lowest degree nodes assigned to defectors", size=2.5) +
      geom_segment(aes(x = 3.3, y = -0.0024, xend = 3.7, yend = -0.0024), linewidth=0.2, arrow = arrow(length = unit(0.1, "cm"))) +
      annotate("text", x=4.6, y= -0.0022, label= "Highest degree nodes assigned to defectors", size=2.5) +
      theme_bw() +
      theme(plot.title = element_text(hjust = 0.5, size=12),legend.position="none") +
      coord_cartesian(ylim=c(0,0.10)) + 
      scale_x_discrete(labels=c('Control','0-25','25-50','50-75','75-100')) +
      scale_color_manual(values = c('0' = "black",'0.25'="black",'0.5'="black",'0.75'="black",'1'="black")) +
      geom_vline(xintercept = 1.5, linetype = "longdash")
    print(g.percentIsolationC)
    
    #percentIsolationD
    #percentage of isolation among those who defected at least once in practice rounds
    g.percentIsolationD = ggbarplot(data=df.netIntLowDegree, x="coopFrac", y="percentIsolationD", add = "mean_se") +
      stat_compare_means(ref.group = "0", label = "p.signif", label.y = 0.298, method="t.test", color="black") +  
      labs(
        title = paste("Isolation among initial defectors, ","V=",V,", Gini=",GINI,sep=""),
        x = "Betweenness centrality percentile of nodes assigned to defectors ",
        y = "Propoption of ever-isolated individuals") +
      annotate("text", x=1, y=0.2990, label= "ref", color="black") +
      annotate("text", x=2.4, y= -0.0062, label= "Lowest degree nodes assigned to defectors", size=2.5) +
      geom_segment(aes(x = 3.3, y = -0.0064, xend = 3.7, yend = -0.0064), linewidth=0.2, arrow = arrow(length = unit(0.1, "cm"))) +
      annotate("text", x=4.6, y= -0.0062, label= "Highest degree nodes assigned to defectors", size=2.5) +
      theme_bw() +
      theme(plot.title = element_text(hjust = 0.5, size=12),legend.position="none") +
      coord_cartesian(ylim=c(0,0.30)) + 
      scale_x_discrete(labels=c('Control','0-25','25-50','50-75','75-100')) +
      scale_color_manual(values = c('0' = "black",'0.25'="black",'0.5'="black",'0.75'="black",'1'="black")) +
      geom_vline(xintercept = 1.5, linetype = "longdash")
    print(g.percentIsolationD)
      
    #avgCoopFinal
    g.avgCoopFinal = ggbarplot(data=df.netIntLowDegree, x="coopFrac", y="avgCoopFinal", add = "mean_se") +
      stat_compare_means(ref.group = "0", label = "p.signif", label.y = 0.98, method="t.test", color="black") +  
      labs(
        title = paste("Cooperation in final round, ","V=",V,", Gini=",GINI,sep=""),
        x = "Betweenness centrality percentile of nodes assigned to defectors ",
        y = "Propoption of cooperators in final round") +
      annotate("text", x=1, y=0.990, label= "ref", color="black") +
      annotate("text", x=2.4, y= -0.0212, label= "Lowest degree nodes assigned to defectors", size=2.5) +
      geom_segment(aes(x = 3.3, y = -0.0214, xend = 3.7, yend = -0.0214), linewidth=0.2, arrow = arrow(length = unit(0.1, "cm"))) +
      annotate("text", x=4.6, y= -0.0212, label= "Highest degree nodes assigned to defectors", size=2.5) +
      theme_bw() +
      theme(plot.title = element_text(hjust = 0.5, size=12),legend.position="none") +
      coord_cartesian(ylim=c(0,1.0)) + 
      scale_x_discrete(labels=c('Control','0-25','25-50','50-75','75-100')) +
      scale_color_manual(values = c('0' = "black",'0.25'="black",'0.5'="black",'0.75'="black",'1'="black")) +
      geom_vline(xintercept = 1.5, linetype = "longdash")
    print(g.avgCoopFinal)
    
    #avg_wealth
    g.avg_wealth = ggbarplot(data=df.netIntLowDegree, x="coopFrac", y="avg_wealth", add = "mean_se") +
      stat_compare_means(ref.group = "0", label = "p.signif", label.y = 6800, method="t.test", color="black") +  
      labs(
        title = paste("Wealth in final round, ","V=",V,", Gini=",GINI,sep=""),
        x = "Betweenness centrality percentile of nodes assigned to defectors ",
        y = "Average wealth in final round") +
      annotate("text", x=1, y=6900, label= "ref", color="black") +
      annotate("text", x=2.4, y= -162, label= "Lowest degree nodes assigned to defectors", size=2.5) +
      geom_segment(aes(x = 3.3, y = -164, xend = 3.7, yend = -164), linewidth=0.2, arrow = arrow(length = unit(0.1, "cm"))) +
      annotate("text", x=4.6, y= -162, label= "Highest degree nodes assigned to defectors", size=2.5) +
      theme_bw() +
      theme(plot.title = element_text(hjust = 0.5, size=12),legend.position="none") +
      coord_cartesian(ylim=c(0,7000)) + 
      scale_x_discrete(labels=c('Control','0-25','25-50','50-75','75-100')) +
      scale_color_manual(values = c('0' = "black",'0.25'="black",'0.5'="black",'0.75'="black",'1'="black")) +
      geom_vline(xintercept = 1.5, linetype = "longdash")
    print(g.avg_wealth)
    
    #gini
    g.gini = ggbarplot(data=df.netIntLowDegree, x="coopFrac", y="gini", add = "mean_se") +
      stat_compare_means(ref.group = "0", label = "p.signif", label.y = 0.48, method="t.test", color="black") +  
      labs(
        title = paste("Gini coefficient in final round, ","V=",V,", Gini=",GINI,sep=""),
        x = "Betweenness centrality percentile of nodes assigned to defectors ",
        y = "Gini coefficient in final round") +
      annotate("text", x=1, y=0.490, label= "ref", color="black") +
      annotate("text", x=2.4, y= -0.0112, label= "Lowest degree nodes assigned to defectors", size=2.5) +
      geom_segment(aes(x = 3.3, y = -0.0114, xend = 3.7, yend = -0.0114), linewidth=0.2, arrow = arrow(length = unit(0.1, "cm"))) +
      annotate("text", x=4.6, y= -0.0112, label= "Highest degree nodes assigned to defectors", size=2.5) +
      theme_bw() +
      theme(plot.title = element_text(hjust = 0.5, size=12),legend.position="none") +
      coord_cartesian(ylim=c(0,0.50)) + 
      scale_x_discrete(labels=c('Control','0-25','25-50','50-75','75-100')) +
      scale_color_manual(values = c('0' = "black",'0.25'="black",'0.5'="black",'0.75'="black",'1'="black")) +
      geom_vline(xintercept = 1.5, linetype = "longdash")
    print(g.gini)
    
    #degree
    g.degree = ggbarplot(data=df.netIntLowDegree, x="coopFrac", y="degree", add = "mean_se") +
      stat_compare_means(ref.group = "0", label = "p.signif", label.y = 14.8, method="t.test", color="black") +  
      labs(
        title = paste("Degree in final round, ","V=",V,", Gini=",GINI,sep=""),
        x = "Betweenness centrality percentile of nodes assigned to defectors ",
        y = "Mean degree in final round") +
      annotate("text", x=1, y=14.90, label= "ref", color="black") +
      annotate("text", x=2.4, y= -0.312, label= "Lowest degree nodes assigned to defectors", size=2.5) +
      geom_segment(aes(x = 3.3, y = -0.314, xend = 3.7, yend = -0.314), linewidth=0.2, arrow = arrow(length = unit(0.1, "cm"))) +
      annotate("text", x=4.6, y= -0.312, label= "Highest degree nodes assigned to defectors", size=2.5) +
      theme_bw() +
      theme(plot.title = element_text(hjust = 0.5, size=12),legend.position="none") +
      coord_cartesian(ylim=c(0,15)) + 
      scale_x_discrete(labels=c('Control','0-25','25-50','50-75','75-100')) +
      scale_color_manual(values = c('0' = "black",'0.25'="black",'0.5'="black",'0.75'="black",'1'="black")) +
      geom_vline(xintercept = 1.5, linetype = "longdash")
    print(g.degree)
    
    #transitivity
    g.transitivity = ggbarplot(data=df.netIntLowDegree, x="coopFrac", y="transitivity", add = "mean_se") +
      stat_compare_means(ref.group = "0", label = "p.signif", label.y = 0.98, method="t.test", color="black") +  
      labs(
        title = paste("Transitivity in final round, ","V=",V,", Gini=",GINI,sep=""),
        x = "Betweenness centrality percentile of nodes assigned to defectors ",
        y = "Transitivity in final round") +
      annotate("text", x=1, y=0.99, label= "ref", color="black") +
      annotate("text", x=2.4, y= -0.0212, label= "Lowest degree nodes assigned to defectors", size=2.5) +
      geom_segment(aes(x = 3.3, y = -0.0214, xend = 3.7, yend = -0.0214), linewidth=0.2, arrow = arrow(length = unit(0.1, "cm"))) +
      annotate("text", x=4.6, y= -0.0212, label= "Highest degree nodes assigned to defectors", size=2.5) +
      theme_bw() +
      theme(plot.title = element_text(hjust = 0.5, size=12),legend.position="none") +
      coord_cartesian(ylim=c(0,1.00)) + 
      scale_x_discrete(labels=c('Control','0-25','25-50','50-75','75-100')) +
      scale_color_manual(values = c('0' = "black",'0.25'="black",'0.5'="black",'0.75'="black",'1'="black")) +
      geom_vline(xintercept = 1.5, linetype = "longdash")
    print(g.transitivity)
    
    #initial C-assortativity     
    plotList <- lapply(
              unique(df.netIntLowDegree$coopFrac),
              function(key) {
                if(key==0){
                  ggplot(data = df.netIntLowDegree[df.netIntLowDegree$coopFrac==key,], aes(x = homophilyC, y = percentIsolation)) + 
                      geom_point() + 
                      scale_x_continuous(paste("C-assortativity, ","Control",sep="")) +
                      scale_y_continuous("Proportion isolated") +
                      geom_smooth(method='lm', formula= y~x) + 
                      stat_cor(method = "pearson")
                }
                else{
                  ggplot(data = df.netIntLowDegree[df.netIntLowDegree$coopFrac==key,], aes(x = homophilyC, y = percentIsolation)) + 
                      geom_point() + 
                      scale_x_continuous(paste("C-assortativity, degree %ile = ",key,sep="")) +
                      scale_y_continuous("Proportion isolated") +
                      geom_smooth(method='lm', formula= y~x) + 
                      stat_cor(method = "pearson")
                }
              }
    )
    plot= ggarrange(plotlist=plotList)
    print(annotate_figure(plot, top = text_grob(paste("Proportion of ever-isolated individuals, ","V=",V,", Gini=", GINI, sep=""), color = "black", face = "bold", size = 10)))
    
    lapply(unique(df.netIntLowDegree$coopFrac),
              function(key) {
                if(key==0){
                  reg = lm(percentIsolation ~ homophilyC + degreeD, data=df.netIntLowDegree[df.netIntLowDegree$coopFrac==key,])
                  print(paste("Regression on proportion of ever-isolated individuals, ","Control"," ; ",sep=""))
                  print(summary(reg)[4]$coefficients)
                }
                else{
                  reg = lm(percentIsolation ~ homophilyC + degreeD, data=df.netIntLowDegree[df.netIntLowDegree$coopFrac==key,])
                  print(paste("Regression on proportion of ever-isolated individuals, degree %ile = ",key," ; ",sep=""))
                  print(summary(reg)[4]$coefficients)
                }
              }
    )
    
    
    
    #initial D-assortativity     
    plotList <- lapply(
              unique(df.netIntLowDegree$coopFrac),
              function(key) {
                if(key==0){
                  ggplot(data = df.netIntLowDegree[df.netIntLowDegree$coopFrac==key,], aes(x = homophilyD, y = percentIsolation)) + 
                      geom_point() +
                      scale_x_continuous(paste("D-assortativity, ","Control",sep="")) + 
                      scale_y_continuous("Proportion isolated") +
                      geom_smooth(method='lm', formula= y~x) + 
                      stat_cor(method = "pearson")
                }
                else{
                  ggplot(data = df.netIntLowDegree[df.netIntLowDegree$coopFrac==key,], aes(x = homophilyD, y = percentIsolation)) + 
                      geom_point() +
                      scale_x_continuous(paste("D-assortativity, degree %ile = ",key,sep="")) + 
                      scale_y_continuous("Proportion isolated") +
                      geom_smooth(method='lm', formula= y~x) + 
                      stat_cor(method = "pearson")
                }
              }
    )
    plot= ggarrange(plotlist=plotList)
    print(annotate_figure(plot, top = text_grob(paste("Proportion of ever-isolated individuals, ","V=",V,", Gini=", GINI, sep=""), color = "black", face = "bold", size = 10)))
    
    lapply(unique(df.netIntLowDegree$coopFrac),
              function(key) {
                if(key==0){
                  reg = lm(percentIsolation ~ homophilyD + degreeD, data=df.netIntLowDegree[df.netIntLowDegree$coopFrac==key,])
                  print(paste("Regression on proportion of ever-isolated individuals, ","Control"," ; ",sep=""))
                  print(summary(reg)[4]$coefficients)
                }
                else{
                  reg = lm(percentIsolation ~ homophilyD + degreeD, data=df.netIntLowDegree[df.netIntLowDegree$coopFrac==key,])
                  print(paste("Regression on proportion of ever-isolated individuals, degree %ile = ",key," ; ",sep=""))
                  print(summary(reg)[4]$coefficients)
                }
              }
    )
    
    }
}
## Loading data last updated on  2023-01-20 20:37:15 
## Call model1.invisible(redo=TRUE) to update data.
## Loading data last updated on  2023-01-20 20:39:47 
## Call model2.invisible(redo=TRUE) to update data.
## Loading data last updated on  2023-01-20 22:02:59 
## Call model3(redo=TRUE) to update data.
## Warning: package 'reldist' was built under R version 4.1.2
## reldist: Relative Distribution Methods
## Version 1.7-1 created on 2022-05-14.
## copyright (c) 2003, Mark S. Handcock, University of California-Los Angeles
##  For citation information, type citation("reldist").
##  Type help(package="reldist") to get started.
## 
## Attaching package: 'reldist'
## The following object is masked from 'package:arsenal':
## 
##     iqr
## 
## Attaching package: 'boot'
## The following object is masked from 'package:lattice':
## 
##     melanoma
## Warning: The dot-dot notation (`..p.signif..`) was deprecated in ggplot2 3.4.0.
## ℹ Please use `after_stat(p.signif)` instead.
## ℹ The deprecated feature was likely used in the ggpubr package.
##   Please report the issue at <https://github.com/kassambara/ggpubr/issues>.

## Warning: Removed 2 rows containing non-finite values (`stat_summary()`).
## Warning: Removed 2 rows containing non-finite values (`stat_compare_means()`).

## [1] "Regression on proportion of ever-isolated individuals, Control ; "
##                Estimate  Std. Error   t value     Pr(>|t|)
## (Intercept)  0.16751618 0.016885298  9.920830 2.779451e-21
## homophilyC  -0.04813531 0.033773803 -1.425226 1.547207e-01
## degreeD     -0.01924910 0.002746726 -7.008017 7.927911e-12
## [1] "Regression on proportion of ever-isolated individuals, degree %ile = 0.25 ; "
##                 Estimate  Std. Error   t value     Pr(>|t|)
## (Intercept)  0.141455851 0.014454839  9.786055 8.469899e-21
## homophilyC  -0.089778405 0.039453457 -2.275552 2.329765e-02
## degreeD     -0.007662134 0.003447906 -2.222257 2.671530e-02
## [1] "Regression on proportion of ever-isolated individuals, degree %ile = 0.5 ; "
##                Estimate  Std. Error   t value     Pr(>|t|)
## (Intercept)  0.16796994 0.014596342 11.507673 2.486206e-27
## homophilyC  -0.09377454 0.037064142 -2.530061 1.171204e-02
## degreeD     -0.01741741 0.003608156 -4.827232 1.845439e-06
## [1] "Regression on proportion of ever-isolated individuals, degree %ile = 0.75 ; "
##                Estimate  Std. Error    t value     Pr(>|t|)
## (Intercept)  0.11942023 0.015630278  7.6403137 1.123530e-13
## homophilyC   0.01615839 0.039760257  0.4063955 6.846270e-01
## degreeD     -0.01481197 0.003431357 -4.3166508 1.912676e-05
## [1] "Regression on proportion of ever-isolated individuals, degree %ile = 1 ; "
##                 Estimate Std. Error   t value     Pr(>|t|)
## (Intercept)  0.119715154 0.01524411  7.853205 2.527636e-14
## homophilyC  -0.075762852 0.03621542 -2.092005 3.694591e-02
## degreeD     -0.009338765 0.00274083 -3.407276 7.094953e-04
## Warning: Removed 2 rows containing non-finite values (`stat_smooth()`).
## Warning: Removed 2 rows containing non-finite values (`stat_cor()`).
## Warning: Removed 2 rows containing missing values (`geom_point()`).
## Warning: Removed 2 rows containing non-finite values (`stat_smooth()`).
## Warning: Removed 2 rows containing non-finite values (`stat_cor()`).
## Warning: Removed 2 rows containing missing values (`geom_point()`).
## Warning: Removed 2 rows containing non-finite values (`stat_smooth()`).
## Warning: Removed 2 rows containing non-finite values (`stat_cor()`).
## Warning: Removed 2 rows containing missing values (`geom_point()`).
## Warning: Removed 2 rows containing non-finite values (`stat_smooth()`).
## Warning: Removed 2 rows containing non-finite values (`stat_cor()`).
## Warning: Removed 2 rows containing missing values (`geom_point()`).
## Warning: Removed 2 rows containing non-finite values (`stat_smooth()`).
## Warning: Removed 2 rows containing non-finite values (`stat_cor()`).
## Warning: Removed 2 rows containing missing values (`geom_point()`).

## [1] "Regression on proportion of ever-isolated individuals, Control ; "
##                Estimate  Std. Error    t value     Pr(>|t|)
## (Intercept)  0.15541161 0.014109483 11.0146918 2.192770e-25
## homophilyD   0.01179763 0.022303070  0.5289688 5.970642e-01
## degreeD     -0.02049112 0.003619767 -5.6608944 2.553909e-08
## [1] "Regression on proportion of ever-isolated individuals, degree %ile = 0.25 ; "
##                 Estimate  Std. Error    t value     Pr(>|t|)
## (Intercept)  0.126147796 0.013300044  9.4847653 1.016694e-19
## homophilyD  -0.011930398 0.020171947 -0.5914351 5.544989e-01
## degreeD     -0.009683864 0.003324906 -2.9125228 3.747167e-03
## [1] "Regression on proportion of ever-isolated individuals, degree %ile = 0.5 ; "
##                 Estimate  Std. Error    t value     Pr(>|t|)
## (Intercept)  0.161651617 0.014682462 11.0098439 2.289636e-25
## homophilyD  -0.002617342 0.018067382 -0.1448656 8.848759e-01
## degreeD     -0.022089119 0.003193202 -6.9175461 1.426383e-11
## [1] "Regression on proportion of ever-isolated individuals, degree %ile = 0.75 ; "
##                Estimate  Std. Error   t value     Pr(>|t|)
## (Intercept)  0.12236183 0.015152597  8.075304 5.162783e-15
## homophilyD  -0.02400507 0.018204442 -1.318638 1.878999e-01
## degreeD     -0.01295775 0.003142779 -4.123024 4.384753e-05
## [1] "Regression on proportion of ever-isolated individuals, degree %ile = 1 ; "
##                 Estimate  Std. Error    t value     Pr(>|t|)
## (Intercept)  0.111228789 0.015123050  7.3549179 7.981304e-13
## homophilyD   0.002423129 0.017104121  0.1416693 8.873988e-01
## degreeD     -0.011857701 0.002526285 -4.6937302 3.477510e-06
## Loading data last updated on  2023-01-20 21:50:22 
## Call model1.visible(redo=TRUE) to update data.
## Loading data last updated on  2023-01-20 21:54:00 
## Call model2.visible(redo=TRUE) to update data.
## Loading data last updated on  2023-01-20 22:02:59 
## Call model3(redo=TRUE) to update data.

## Warning: Removed 1 rows containing non-finite values (`stat_summary()`).
## Warning: Removed 1 rows containing non-finite values (`stat_compare_means()`).

## [1] "Regression on proportion of ever-isolated individuals, Control ; "
##                Estimate  Std. Error   t value     Pr(>|t|)
## (Intercept)  0.15183304 0.014454328 10.504331 1.931068e-23
## homophilyC  -0.03757887 0.029297676 -1.282657 2.002114e-01
## degreeD     -0.02133913 0.002291528 -9.312185 4.062481e-19
## [1] "Regression on proportion of ever-isolated individuals, degree %ile = 0.25 ; "
##                Estimate  Std. Error   t value     Pr(>|t|)
## (Intercept)  0.18990480 0.012864908 14.761458 3.750439e-41
## homophilyC  -0.08580951 0.038498743 -2.228891 2.626750e-02
## degreeD     -0.02620748 0.003026806 -8.658461 6.709749e-17
## [1] "Regression on proportion of ever-isolated individuals, degree %ile = 0.5 ; "
##                Estimate  Std. Error   t value     Pr(>|t|)
## (Intercept)  0.16864860 0.012932916 13.040261 1.228261e-33
## homophilyC  -0.05204030 0.035691856 -1.458044 1.454600e-01
## degreeD     -0.02572879 0.003059094 -8.410591 4.351748e-16
## [1] "Regression on proportion of ever-isolated individuals, degree %ile = 0.75 ; "
##                Estimate  Std. Error   t value     Pr(>|t|)
## (Intercept)  0.12894947 0.012273216 10.506575 1.875729e-23
## homophilyC  -0.06385772 0.027826388 -2.294862 2.215690e-02
## degreeD     -0.01601181 0.002624411 -6.101105 2.120640e-09
## [1] "Regression on proportion of ever-isolated individuals, degree %ile = 1 ; "
##                Estimate  Std. Error    t value     Pr(>|t|)
## (Intercept)  0.11119505 0.012157768  9.1460085 1.517636e-18
## homophilyC  -0.02469167 0.026276184 -0.9396976 3.478291e-01
## degreeD     -0.01302453 0.002088523 -6.2362393 9.589485e-10
## Warning: Removed 2 rows containing non-finite values (`stat_smooth()`).
## Warning: Removed 2 rows containing non-finite values (`stat_cor()`).
## Warning: Removed 2 rows containing missing values (`geom_point()`).
## Warning: Removed 1 rows containing non-finite values (`stat_smooth()`).
## Warning: Removed 1 rows containing non-finite values (`stat_cor()`).
## Warning: Removed 1 rows containing missing values (`geom_point()`).
## Warning: Removed 2 rows containing non-finite values (`stat_smooth()`).
## Warning: Removed 2 rows containing non-finite values (`stat_cor()`).
## Warning: Removed 2 rows containing missing values (`geom_point()`).

## [1] "Regression on proportion of ever-isolated individuals, Control ; "
##                 Estimate  Std. Error    t value     Pr(>|t|)
## (Intercept)  0.139324970 0.011647322 11.9619749 3.826354e-29
## homophilyD  -0.003886736 0.020208488 -0.1923318 8.475612e-01
## degreeD     -0.020846701 0.003026866 -6.8872225 1.733098e-11
## [1] "Regression on proportion of ever-isolated individuals, degree %ile = 0.25 ; "
##                Estimate  Std. Error   t value     Pr(>|t|)
## (Intercept)  0.18024791 0.011476676 15.705585 1.989197e-45
## homophilyD  -0.02924552 0.019064339 -1.534043 1.256553e-01
## degreeD     -0.02797936 0.002857499 -9.791556 8.092369e-21
## [1] "Regression on proportion of ever-isolated individuals, degree %ile = 0.5 ; "
##                Estimate  Std. Error    t value     Pr(>|t|)
## (Intercept)  0.16510745 0.012530104 13.1768624 3.289098e-34
## homophilyD  -0.01330004 0.015804301 -0.8415458 4.004478e-01
## degreeD     -0.02747569 0.002754866 -9.9735103 1.787958e-21
## [1] "Regression on proportion of ever-isolated individuals, degree %ile = 0.75 ; "
##                Estimate  Std. Error  t value     Pr(>|t|)
## (Intercept)  0.12366896 0.012040351 10.27121 1.424081e-22
## homophilyD  -0.01649021 0.014432818 -1.14255 2.537756e-01
## degreeD     -0.01788293 0.002461298 -7.26565 1.446236e-12
## [1] "Regression on proportion of ever-isolated individuals, degree %ile = 1 ; "
##                  Estimate  Std. Error      t value     Pr(>|t|)
## (Intercept)  1.082852e-01 0.011928829  9.077603849 2.635311e-18
## homophilyD  -7.396102e-05 0.013807092 -0.005356741 9.957281e-01
## degreeD     -1.375043e-02 0.001973037 -6.969169065 1.022265e-11
## Loading data last updated on  2023-01-20 20:37:15 
## Call model1.invisible(redo=TRUE) to update data.
## Loading data last updated on  2023-01-20 20:39:47 
## Call model2.invisible(redo=TRUE) to update data.
## Loading data last updated on  2023-01-20 22:02:59 
## Call model3(redo=TRUE) to update data.

## Warning: Removed 1 rows containing non-finite values (`stat_summary()`).
## Warning: Removed 1 rows containing non-finite values (`stat_compare_means()`).

## [1] "Regression on proportion of ever-isolated individuals, Control ; "
##                Estimate  Std. Error    t value     Pr(>|t|)
## (Intercept)  0.15851791 0.016024853  9.8920044 3.536086e-21
## homophilyC  -0.02777185 0.032480994 -0.8550186 3.929536e-01
## degreeD     -0.01844878 0.002540512 -7.2618360 1.487397e-12
## [1] "Regression on proportion of ever-isolated individuals, degree %ile = 0.25 ; "
##                Estimate  Std. Error   t value     Pr(>|t|)
## (Intercept)  0.18731231 0.014075777 13.307422 8.911896e-35
## homophilyC  -0.17562208 0.042122318 -4.169336 3.604345e-05
## degreeD     -0.01259136 0.003311694 -3.802089 1.613122e-04
## [1] "Regression on proportion of ever-isolated individuals, degree %ile = 0.5 ; "
##                Estimate  Std. Error   t value     Pr(>|t|)
## (Intercept)  0.18070551 0.015092369 11.973303 3.339838e-29
## homophilyC  -0.05314361 0.041651447 -1.275913 2.025823e-01
## degreeD     -0.02239345 0.003569882 -6.272884 7.713967e-10
## [1] "Regression on proportion of ever-isolated individuals, degree %ile = 0.75 ; "
##                 Estimate  Std. Error    t value     Pr(>|t|)
## (Intercept)  0.135099198 0.015774393  8.5644626 1.369662e-16
## homophilyC  -0.007994288 0.035764412 -0.2235263 8.232177e-01
## degreeD     -0.016201350 0.003373076 -4.8031386 2.070898e-06
## [1] "Regression on proportion of ever-isolated individuals, degree %ile = 1 ; "
##                 Estimate  Std. Error    t value     Pr(>|t|)
## (Intercept)  0.102388507 0.014136740  7.2427239 1.685566e-12
## homophilyC  -0.007519944 0.030553271 -0.2461257 8.056866e-01
## degreeD     -0.009795349 0.002428481 -4.0335300 6.358746e-05
## Warning: Removed 2 rows containing non-finite values (`stat_smooth()`).
## Warning: Removed 2 rows containing non-finite values (`stat_cor()`).
## Warning: Removed 2 rows containing missing values (`geom_point()`).
## Warning: Removed 1 rows containing non-finite values (`stat_smooth()`).
## Warning: Removed 1 rows containing non-finite values (`stat_cor()`).
## Warning: Removed 1 rows containing missing values (`geom_point()`).
## Warning: Removed 2 rows containing non-finite values (`stat_smooth()`).
## Warning: Removed 2 rows containing non-finite values (`stat_cor()`).
## Warning: Removed 2 rows containing missing values (`geom_point()`).

## [1] "Regression on proportion of ever-isolated individuals, Control ; "
##                Estimate  Std. Error    t value     Pr(>|t|)
## (Intercept)  0.14734797 0.012886215 11.4345428 4.976651e-27
## homophilyD  -0.01427898 0.022358008 -0.6386519 5.233448e-01
## degreeD     -0.01695236 0.003348825 -5.0621811 5.855369e-07
## [1] "Regression on proportion of ever-isolated individuals, degree %ile = 0.25 ; "
##                Estimate  Std. Error   t value     Pr(>|t|)
## (Intercept)  0.16069338 0.012718749 12.634370 6.291964e-32
## homophilyD  -0.02804797 0.021127593 -1.327552 1.849357e-01
## degreeD     -0.01702321 0.003166755 -5.375601 1.176057e-07
## [1] "Regression on proportion of ever-isolated individuals, degree %ile = 0.5 ; "
##                Estimate  Std. Error   t value     Pr(>|t|)
## (Intercept)  0.17116000 0.014596474 11.726120 3.377391e-28
## homophilyD   0.02074960 0.018410626  1.127045 2.602685e-01
## degreeD     -0.02518894 0.003209178 -7.849034 2.603535e-14
## [1] "Regression on proportion of ever-isolated individuals, degree %ile = 0.75 ; "
##                 Estimate  Std. Error    t value     Pr(>|t|)
## (Intercept)  0.134830714 0.015411833  8.7485193 3.369241e-17
## homophilyD  -0.007990138 0.018474226 -0.4325019 6.655642e-01
## degreeD     -0.016166727 0.003150499 -5.1314808 4.130154e-07
## [1] "Regression on proportion of ever-isolated individuals, degree %ile = 1 ; "
##                 Estimate Std. Error   t value     Pr(>|t|)
## (Intercept)  0.104832154 0.01382195  7.584469 1.664536e-13
## homophilyD  -0.021685260 0.01599830 -1.355473 1.758850e-01
## degreeD     -0.009472165 0.00228616 -4.143264 4.026870e-05
## Loading data last updated on  2023-01-20 21:50:22 
## Call model1.visible(redo=TRUE) to update data.
## Loading data last updated on  2023-01-20 21:54:00 
## Call model2.visible(redo=TRUE) to update data.
## Loading data last updated on  2023-01-20 22:02:59 
## Call model3(redo=TRUE) to update data.

## Warning: Removed 1 rows containing non-finite values (`stat_summary()`).
## Warning: Removed 1 rows containing non-finite values (`stat_compare_means()`).

## [1] "Regression on proportion of ever-isolated individuals, Control ; "
##                Estimate  Std. Error   t value     Pr(>|t|)
## (Intercept)  0.16845954 0.014239102  11.83077 1.280286e-28
## homophilyC  -0.06814847 0.028861432  -2.36123 1.860016e-02
## degreeD     -0.02273282 0.002257406 -10.07032 7.916384e-22
## [1] "Regression on proportion of ever-isolated individuals, degree %ile = 0.25 ; "
##                Estimate  Std. Error   t value     Pr(>|t|)
## (Intercept)  0.18718077 0.013203698 14.176390 1.488997e-38
## homophilyC  -0.08005757 0.039512587 -2.026128 4.328528e-02
## degreeD     -0.02573893 0.003106515 -8.285469 1.101639e-15
## [1] "Regression on proportion of ever-isolated individuals, degree %ile = 0.5 ; "
##                Estimate  Std. Error   t value     Pr(>|t|)
## (Intercept)  0.16607794 0.012415799 13.376340 4.511484e-35
## homophilyC  -0.04777935 0.034264732 -1.394418 1.638145e-01
## degreeD     -0.02527293 0.002936778 -8.605667 1.002455e-16
## [1] "Regression on proportion of ever-isolated individuals, degree %ile = 0.75 ; "
##                Estimate Std. Error   t value     Pr(>|t|)
## (Intercept)  0.13071132 0.01246341 10.487606 2.210958e-23
## homophilyC  -0.05521989 0.02825760 -1.954161 5.124262e-02
## degreeD     -0.01724375 0.00266508 -6.470257 2.347055e-10
## [1] "Regression on proportion of ever-isolated individuals, degree %ile = 1 ; "
##                Estimate  Std. Error   t value     Pr(>|t|)
## (Intercept)  0.11383591 0.011539858  9.864585 4.410118e-21
## homophilyC  -0.05719889 0.024940716 -2.293394 2.224187e-02
## degreeD     -0.01260926 0.001982375 -6.360681 4.560387e-10
## Warning: Removed 2 rows containing non-finite values (`stat_smooth()`).
## Warning: Removed 2 rows containing non-finite values (`stat_cor()`).
## Warning: Removed 2 rows containing missing values (`geom_point()`).
## Warning: Removed 1 rows containing non-finite values (`stat_smooth()`).
## Warning: Removed 1 rows containing non-finite values (`stat_cor()`).
## Warning: Removed 1 rows containing missing values (`geom_point()`).
## Warning: Removed 2 rows containing non-finite values (`stat_smooth()`).
## Warning: Removed 2 rows containing non-finite values (`stat_cor()`).
## Warning: Removed 2 rows containing missing values (`geom_point()`).

## [1] "Regression on proportion of ever-isolated individuals, Control ; "
##                Estimate  Std. Error   t value     Pr(>|t|)
## (Intercept)  0.15034009 0.011507355 13.064695 1.006971e-33
## homophilyD   0.02019359 0.019965641  1.011417 3.123111e-01
## degreeD     -0.02451522 0.002990492 -8.197722 2.117160e-15
## [1] "Regression on proportion of ever-isolated individuals, degree %ile = 0.25 ; "
##                 Estimate Std. Error    t value     Pr(>|t|)
## (Intercept)  0.173858850 0.01179498 14.7400779 4.674937e-41
## homophilyD  -0.007274705 0.01959308 -0.3712895 7.105801e-01
## degreeD     -0.027898748 0.00293675 -9.4998703 8.872828e-20
## [1] "Regression on proportion of ever-isolated individuals, degree %ile = 0.5 ; "
##                Estimate  Std. Error    t value     Pr(>|t|)
## (Intercept)  0.16395989 0.012016311  13.644777 3.207651e-36
## homophilyD  -0.01836986 0.015156251  -1.212032 2.260773e-01
## degreeD     -0.02670699 0.002641904 -10.108995 5.709301e-22
## [1] "Regression on proportion of ever-isolated individuals, degree %ile = 0.75 ; "
##                 Estimate  Std. Error    t value     Pr(>|t|)
## (Intercept)  0.125586031 0.012223385 10.2742437 1.387591e-22
## homophilyD  -0.005821035 0.014652220 -0.3972801 6.913315e-01
## degreeD     -0.019244661 0.002498714 -7.7018254 7.317261e-14
## [1] "Regression on proportion of ever-isolated individuals, degree %ile = 1 ; "
##                  Estimate  Std. Error     t value     Pr(>|t|)
## (Intercept)  0.1069602950 0.011374845  9.40323109 1.966269e-19
## homophilyD  -0.0001726233 0.013165880 -0.01311141 9.895442e-01
## degreeD     -0.0142939787 0.001881407 -7.59749240 1.521220e-13
## Loading data last updated on  2023-01-20 20:37:15 
## Call model1.invisible(redo=TRUE) to update data.
## Loading data last updated on  2023-01-20 20:39:47 
## Call model2.invisible(redo=TRUE) to update data.
## Loading data last updated on  2023-01-20 22:02:59 
## Call model3(redo=TRUE) to update data.

## Warning: Removed 1 rows containing non-finite values (`stat_summary()`).
## Warning: Removed 1 rows containing non-finite values (`stat_compare_means()`).

## [1] "Regression on proportion of ever-isolated individuals, Control ; "
##                Estimate  Std. Error   t value     Pr(>|t|)
## (Intercept)  0.15694230 0.016392636  9.573951 4.885753e-20
## homophilyC  -0.04027299 0.033226459 -1.212076 2.260604e-01
## degreeD     -0.01720200 0.002598819 -6.619162 9.396739e-11
## [1] "Regression on proportion of ever-isolated individuals, degree %ile = 0.25 ; "
##                Estimate  Std. Error   t value     Pr(>|t|)
## (Intercept)  0.18117928 0.014524914 12.473690 2.938080e-31
## homophilyC  -0.13552919 0.043466377 -3.118024 1.926230e-03
## degreeD     -0.01358273 0.003417365 -3.974620 8.094304e-05
## [1] "Regression on proportion of ever-isolated individuals, degree %ile = 0.5 ; "
##                Estimate  Std. Error   t value     Pr(>|t|)
## (Intercept)  0.18422124 0.015060691 12.231925 2.929444e-30
## homophilyC  -0.06201034 0.041564023 -1.491923 1.363537e-01
## degreeD     -0.02198254 0.003562389 -6.170729 1.411398e-09
## [1] "Regression on proportion of ever-isolated individuals, degree %ile = 0.75 ; "
##                 Estimate  Std. Error    t value     Pr(>|t|)
## (Intercept)  0.121675840 0.015963103  7.6223178 1.273081e-13
## homophilyC  -0.009786108 0.036192263 -0.2703923 7.869707e-01
## degreeD     -0.012913610 0.003413428 -3.7831793 1.737053e-04
## [1] "Regression on proportion of ever-isolated individuals, degree %ile = 1 ; "
##                 Estimate Std. Error    t value     Pr(>|t|)
## (Intercept)  0.085559141 0.01420700  6.0223240 3.346340e-09
## homophilyC  -0.021949513 0.03070512 -0.7148487 4.750382e-01
## degreeD     -0.006026241 0.00244055 -2.4692145 1.387611e-02
## Warning: Removed 2 rows containing non-finite values (`stat_smooth()`).
## Warning: Removed 2 rows containing non-finite values (`stat_cor()`).
## Warning: Removed 2 rows containing missing values (`geom_point()`).
## Warning: Removed 1 rows containing non-finite values (`stat_smooth()`).
## Warning: Removed 1 rows containing non-finite values (`stat_cor()`).
## Warning: Removed 1 rows containing missing values (`geom_point()`).
## Warning: Removed 2 rows containing non-finite values (`stat_smooth()`).
## Warning: Removed 2 rows containing non-finite values (`stat_cor()`).
## Warning: Removed 2 rows containing missing values (`geom_point()`).

## [1] "Regression on proportion of ever-isolated individuals, Control ; "
##                 Estimate  Std. Error    t value     Pr(>|t|)
## (Intercept)  0.143453337 0.013196947 10.8701914 7.915218e-25
## homophilyD  -0.004574247 0.022897138 -0.1997737 8.417396e-01
## degreeD     -0.016621520 0.003429577 -4.8465214 1.684099e-06
## [1] "Regression on proportion of ever-isolated individuals, degree %ile = 0.25 ; "
##                Estimate Std. Error    t value     Pr(>|t|)
## (Intercept)  0.16041711 0.01303767 12.3041283 1.477670e-30
## homophilyD  -0.02062359 0.02165736 -0.9522671 3.414244e-01
## degreeD     -0.01702869 0.00324616 -5.2457967 2.307452e-07
## [1] "Regression on proportion of ever-isolated individuals, degree %ile = 0.5 ; "
##                 Estimate  Std. Error   t value     Pr(>|t|)
## (Intercept)  0.176007829 0.014588886 12.064515 1.442215e-29
## homophilyD   0.007355234 0.018401055  0.399718 6.895363e-01
## degreeD     -0.024750050 0.003207509 -7.716283 6.634377e-14
## [1] "Regression on proportion of ever-isolated individuals, degree %ile = 0.75 ; "
##                Estimate  Std. Error    t value     Pr(>|t|)
## (Intercept)  0.12153030 0.015592438  7.7941821 3.824805e-14
## homophilyD  -0.01254509 0.018690718 -0.6711937 5.024090e-01
## degreeD     -0.01274581 0.003187419 -3.9987885 7.333951e-05
## [1] "Regression on proportion of ever-isolated individuals, degree %ile = 1 ; "
##                 Estimate  Std. Error   t value     Pr(>|t|)
## (Intercept)  0.088353032 0.013851340  6.378663 4.104993e-10
## homophilyD  -0.035881220 0.016032313 -2.238056 2.566131e-02
## degreeD     -0.005774635 0.002291021 -2.520550 1.203041e-02
## Loading data last updated on  2023-01-20 21:50:22 
## Call model1.visible(redo=TRUE) to update data.
## Loading data last updated on  2023-01-20 21:54:00 
## Call model2.visible(redo=TRUE) to update data.
## Loading data last updated on  2023-01-20 22:02:59 
## Call model3(redo=TRUE) to update data.

## Warning: Removed 1 rows containing non-finite values (`stat_summary()`).
## Warning: Removed 1 rows containing non-finite values (`stat_compare_means()`).

## [1] "Regression on proportion of ever-isolated individuals, Control ; "
##                 Estimate  Std. Error     t value     Pr(>|t|)
## (Intercept)  0.135174254 0.013088390 10.32779859 8.849968e-23
## homophilyC  -0.001802408 0.026529037 -0.06794094 9.458600e-01
## degreeD     -0.020121009 0.002074977 -9.69697743 1.781259e-20
## [1] "Regression on proportion of ever-isolated individuals, degree %ile = 0.25 ; "
##               Estimate  Std. Error   t value     Pr(>|t|)
## (Intercept)  0.1651633 0.012725427 12.978999 2.233526e-33
## homophilyC  -0.1529769 0.038081342 -4.017109 6.803243e-05
## degreeD     -0.0143191 0.002993989 -4.782615 2.283680e-06
## [1] "Regression on proportion of ever-isolated individuals, degree %ile = 0.5 ; "
##                Estimate  Std. Error   t value     Pr(>|t|)
## (Intercept)  0.16624546 0.012649490 13.142464 4.515750e-34
## homophilyC  -0.08387850 0.034909664 -2.402730 1.663885e-02
## degreeD     -0.02286521 0.002992054 -7.641977 1.110613e-13
## [1] "Regression on proportion of ever-isolated individuals, degree %ile = 0.75 ; "
##                Estimate  Std. Error   t value     Pr(>|t|)
## (Intercept)  0.12516292 0.013145107  9.521636 7.433334e-20
## homophilyC  -0.03589510 0.029803176 -1.204405 2.290063e-01
## degreeD     -0.01686552 0.002810849 -6.000150 3.801451e-09
## [1] "Regression on proportion of ever-isolated individuals, degree %ile = 1 ; "
##                 Estimate  Std. Error    t value     Pr(>|t|)
## (Intercept)  0.096514101 0.010058418  9.5953557 4.073043e-20
## homophilyC  -0.006976182 0.021738928 -0.3209074 7.484155e-01
## degreeD     -0.012635415 0.001727886 -7.3126446 1.055376e-12
## Warning: Removed 2 rows containing non-finite values (`stat_smooth()`).
## Warning: Removed 2 rows containing non-finite values (`stat_cor()`).
## Warning: Removed 2 rows containing missing values (`geom_point()`).
## Warning: Removed 1 rows containing non-finite values (`stat_smooth()`).
## Warning: Removed 1 rows containing non-finite values (`stat_cor()`).
## Warning: Removed 1 rows containing missing values (`geom_point()`).
## Warning: Removed 2 rows containing non-finite values (`stat_smooth()`).
## Warning: Removed 2 rows containing non-finite values (`stat_cor()`).
## Warning: Removed 2 rows containing missing values (`geom_point()`).

## [1] "Regression on proportion of ever-isolated individuals, Control ; "
##                 Estimate  Std. Error    t value     Pr(>|t|)
## (Intercept)  0.136038838 0.010525802 12.9243208 3.955062e-33
## homophilyD   0.008729852 0.018262614  0.4780177 6.328487e-01
## degreeD     -0.020949587 0.002735409 -7.6586661 9.950491e-14
## [1] "Regression on proportion of ever-isolated individuals, degree %ile = 0.25 ; "
##               Estimate  Std. Error    t value     Pr(>|t|)
## (Intercept)  0.1405963 0.011494690 12.2314091 2.943768e-30
## homophilyD  -0.0180258 0.019094263 -0.9440425 3.456066e-01
## degreeD     -0.0183417 0.002861985 -6.4087335 3.411791e-10
## [1] "Regression on proportion of ever-isolated individuals, degree %ile = 0.5 ; "
##                 Estimate  Std. Error    t value     Pr(>|t|)
## (Intercept)  0.157889678 0.012305140 12.8311977 9.579336e-33
## homophilyD  -0.007930967 0.015520552 -0.5109978 6.095800e-01
## degreeD     -0.026025813 0.002705405 -9.6199306 3.354232e-20
## [1] "Regression on proportion of ever-isolated individuals, degree %ile = 0.75 ; "
##                Estimate Std. Error    t value     Pr(>|t|)
## (Intercept)  0.12240264 0.01285510  9.5217202 7.428216e-20
## homophilyD  -0.01240831 0.01540946 -0.8052401 4.210662e-01
## degreeD     -0.01777487 0.00262785 -6.7640378 3.781935e-11
## [1] "Regression on proportion of ever-isolated individuals, degree %ile = 1 ; "
##                 Estimate  Std. Error    t value     Pr(>|t|)
## (Intercept)  0.096056469 0.009862935  9.7391361 1.267436e-20
## homophilyD  -0.002209617 0.011415911 -0.1935559 8.466030e-01
## degreeD     -0.012784852 0.001631337 -7.8370418 2.844126e-14
plot.trends <- 
  data.frame(
    trends.df %>% 
      group_by(round, V, GINI, fractionCoop) %>% 
      summarize_all(list(mean=~mean(., na.rm=TRUE),sd=~sd(., na.rm=TRUE)))
  )

plot.trends$V = factor(plot.trends$V)
plot.trends$GINI = factor(plot.trends$GINI)

for(i in unique(plot.trends$fractionCoop)){
  g.gini = ggplot(data=plot.trends[plot.trends$fractionCoop==i,], aes(x=round,y=gini_mean,group=interaction(GINI,V))) +
  geom_line(aes(color=GINI,linetype=V)) +
  geom_ribbon(aes(ymin = gini_mean - gini_sd, ymax = gini_mean + gini_sd, fill=GINI),alpha=0.3) +
  xlab("Round")+
  ylab("gini") +
  theme_bw() 

  g.gmd = ggplot(data=plot.trends[plot.trends$fractionCoop==i,], aes(x=round,y=gmd_mean,group=interaction(GINI,V))) +
    geom_line(aes(color=GINI,linetype=V)) +
    geom_ribbon(aes(ymin = gmd_mean - gmd_sd, ymax = gmd_mean + gmd_sd, fill=GINI),alpha=0.3) +
    xlab("Round")+
    ylab("gmd") +
    theme_bw() 
  
  g.avg_wealth = ggplot(data=plot.trends[plot.trends$fractionCoop==i,], aes(x=round,y=avg_wealth_mean,group=interaction(GINI,V))) +
    geom_line(aes(color=GINI,linetype=V)) +
    geom_ribbon(aes(ymin = avg_wealth_mean - avg_wealth_sd, ymax = avg_wealth_mean + avg_wealth_sd, fill=GINI),alpha=0.3) +
    xlab("Round")+
    ylab("avg_wealth") +
    theme_bw() 
  
  g.avg_coop = ggplot(data=plot.trends[plot.trends$fractionCoop==i,], aes(x=round,y=avg_coop_mean,group=interaction(GINI,V))) +
    geom_line(aes(color=GINI,linetype=V)) +
    geom_ribbon(aes(ymin = avg_coop_mean - avg_coop_sd, ymax = avg_coop_mean + avg_coop_sd, fill=GINI),alpha=0.3) +
    xlab("Round")+
    ylab("avg_coop") +
    theme_bw() 
  
  g.avg_degree = ggplot(data=plot.trends[plot.trends$fractionCoop==i,], aes(x=round,y=avg_degree_mean,group=interaction(GINI,V))) +
    geom_line(aes(color=GINI,linetype=V)) +
    geom_ribbon(aes(ymin = avg_degree_mean - avg_degree_sd, ymax = avg_degree_mean + avg_degree_sd, fill=GINI),alpha=0.3) +
    xlab("Round")+
    ylab("avg_degree") +
    theme_bw() 
   
  
  
  plot <- ggarrange(g.gini,g.gmd,g.avg_wealth,g.avg_coop,g.avg_degree,common.legend = TRUE,legend="bottom")
  print(annotate_figure(plot, top = text_grob(paste("Betweenness centrality percentile of nodes assigned to defectors =",i), color = "black", face = "bold", size = 10)))
}
## Warning: Removed 6 rows containing missing values (`geom_line()`).
## Warning: Removed 6 rows containing missing values (`geom_line()`).

## Warning: Removed 6 rows containing missing values (`geom_line()`).

## Warning: Removed 6 rows containing missing values (`geom_line()`).

## Warning: Removed 6 rows containing missing values (`geom_line()`).

fig1 = ggplot(data = df.netIntLowDegree, 
                         aes(x = degreeD, y = homophilyC, color = percentIsolation*100)) + 
  geom_point() +
  scale_x_continuous("Mean degree of defectors") + 
  scale_y_continuous("C-assortativity") +  
  scale_color_viridis(option = "magma") +
  labs(color="Isolated \nindividuals (%)")

fig2 = ggplot(data = df.netIntLowDegree, 
                         aes(x = degreeD, y = homophilyD, color = percentIsolation*100)) + 
  geom_point() +
  scale_x_continuous("Mean degree of defectors") + 
  scale_y_continuous("D-assortativity") +  
  scale_color_viridis(option = "magma") +
  labs(color="Isolated \nindividuals (%)")

fig3 = ggplot(data = df.netIntLowDegree, 
                         aes(x = degreeD, y = heterophily, color = percentIsolation*100)) + 
  geom_point() +
  scale_x_continuous("Mean degree of defectors") + 
  scale_y_continuous("Heterophily") +  
  scale_color_viridis(option = "magma") +
  labs(color="Isolated \nindividuals (%)")

fig4 = ggplot(data = df.netIntLowDegree, 
                         aes(x = degreeC, y = homophilyC, color = percentIsolation*100)) + 
  geom_point() +
  scale_x_continuous("Mean degree of cooperators") + 
  scale_y_continuous("C-assortativity") +  
  scale_color_viridis(option = "magma") +
  labs(color="Isolated \nindividuals (%)")

fig5 = ggplot(data = df.netIntLowDegree, 
                         aes(x = degreeC, y = homophilyD, color = percentIsolation*100)) + 
  geom_point() +
  scale_x_continuous("Mean degree of cooperators") + 
  scale_y_continuous("D-assortativity") +  
  scale_color_viridis(option = "magma") +
  labs(color="Isolated \nindividuals (%)")


fig6 = ggplot(data = df.netIntLowDegree, 
                         aes(x = degreeC, y = heterophily, color = percentIsolation*100)) + 
  geom_point() +
  scale_x_continuous("Mean degree of cooperators") + 
  scale_y_continuous("Heterophily") +  
  scale_color_viridis(option = "magma") +
  labs(color="Isolated \nindividuals (%)")

fig7 = ggplot(data = df.netIntLowDegree, 
                         aes(x = degreeC, y = degreeD, color = percentIsolation*100)) + 
  geom_point() +
  scale_x_continuous("Mean degree of cooperators") + 
  scale_y_continuous("Mean degree of defectors") +  
  scale_color_viridis(option = "magma") +
  labs(color="Isolated \nindividuals (%)")

print(ggarrange(fig1,fig2,fig3,fig4,fig5,fig6,fig7,common.legend = TRUE,legend="right"))
## Warning: Removed 1 rows containing missing values (`geom_point()`).
## Removed 1 rows containing missing values (`geom_point()`).
## Warning: Removed 5 rows containing missing values (`geom_point()`).
## Warning: Removed 1 rows containing missing values (`geom_point()`).
## Warning: Removed 5 rows containing missing values (`geom_point()`).
## Warning: Removed 1 rows containing missing values (`geom_point()`).
## Removed 1 rows containing missing values (`geom_point()`).

fig1 = ggplot(data = df.netIntLowDegree, 
                         aes(x = degreeC, y = percentIsolation*100)) + 
  geom_point() +
  scale_x_continuous("Mean degree of cooperators") + 
  scale_y_continuous("Isolated individuals (%)") 


fig2 = ggplot(data = df.netIntLowDegree, 
                         aes(x = degreeD, y = percentIsolation*100)) + 
  geom_point() +
  scale_x_continuous("Mean degree of defectors") + 
  scale_y_continuous("Isolated individuals (%)") 


fig3 = ggplot(data = df.netIntLowDegree, 
                         aes(x = homophilyC, y = percentIsolation*100)) + 
  geom_point() +
  scale_x_continuous("C-assortativity") + 
  scale_y_continuous("Isolated individuals (%)") 



fig4 = ggplot(data = df.netIntLowDegree, 
                         aes(x = homophilyD, y = percentIsolation*100)) + 
  geom_point() +
  scale_x_continuous("D-assortativity") + 
  scale_y_continuous("Isolated individuals (%)") 



print(ggarrange(fig1,fig2,fig3,fig4,common.legend = TRUE,legend="right"))
## Warning: Removed 1 rows containing missing values (`geom_point()`).
## Warning: Removed 5 rows containing missing values (`geom_point()`).
## Warning: Removed 1 rows containing missing values (`geom_point()`).
## Warning: Removed 5 rows containing missing values (`geom_point()`).

reg.isolation = glm(percentIsolation*100 ~ degreeC + degreeD + homophilyC + homophilyD + heterophily, data=df.netIntLowDegree, family = gaussian(link = "identity"))
summary(reg.isolation)
## 
## Call:
## glm(formula = percentIsolation * 100 ~ degreeC + degreeD + homophilyC + 
##     homophilyD + heterophily, family = gaussian(link = "identity"), 
##     data = df.netIntLowDegree)
## 
## Deviance Residuals: 
##     Min       1Q   Median       3Q      Max  
## -9.5624  -3.2981  -0.7546   2.3054  25.0697  
## 
## Coefficients:
##             Estimate Std. Error t value Pr(>|t|)    
## (Intercept)  14.9883     0.6762  22.166  < 2e-16 ***
## degreeC       0.4052     0.2236   1.813  0.07002 .  
## degreeD      -1.5882     0.1377 -11.535  < 2e-16 ***
## homophilyC   -8.2121     2.0844  -3.940 8.38e-05 ***
## homophilyD   -1.6686     0.8130  -2.052  0.04023 *  
## heterophily  -8.2927     2.9593  -2.802  0.00511 ** 
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## 
## (Dispersion parameter for gaussian family taken to be 19.88453)
## 
##     Null deviance: 62198  on 2494  degrees of freedom
## Residual deviance: 49493  on 2489  degrees of freedom
##   (5 observations deleted due to missingness)
## AIC: 14548
## 
## Number of Fisher Scoring iterations: 2
#variance inflation factor
car::vif(reg.isolation)
##     degreeC     degreeD  homophilyC  homophilyD heterophily 
##    4.120541    3.020637    2.674990    1.453953    3.626515
reg.isolation = glm(percentIsolation*100 ~ degreeD + homophilyD, data=df.netIntLowDegree, family = gaussian(link = "identity"))
summary(reg.isolation)
## 
## Call:
## glm(formula = percentIsolation * 100 ~ degreeD + homophilyD, 
##     family = gaussian(link = "identity"), data = df.netIntLowDegree)
## 
## Deviance Residuals: 
##     Min       1Q   Median       3Q      Max  
## -9.3981  -3.3339  -0.7623   2.2107  25.0207  
## 
## Coefficients:
##             Estimate Std. Error t value Pr(>|t|)    
## (Intercept) 13.40031    0.41200  32.525   <2e-16 ***
## degreeD     -1.95256    0.08109 -24.077   <2e-16 ***
## homophilyD  -0.58254    0.69013  -0.844    0.399    
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## 
## (Dispersion parameter for gaussian family taken to be 20.03998)
## 
##     Null deviance: 62198  on 2494  degrees of freedom
## Residual deviance: 49940  on 2492  degrees of freedom
##   (5 observations deleted due to missingness)
## AIC: 14565
## 
## Number of Fisher Scoring iterations: 2
#variance inflation factor
car::vif(reg.isolation)
##    degreeD homophilyD 
##   1.039634   1.039634
#double machine learning
library(DoubleML)
## Warning: package 'DoubleML' was built under R version 4.1.2
library(mlr3)
## Warning: package 'mlr3' was built under R version 4.1.2
library(mlr3learners)
## Warning: package 'mlr3learners' was built under R version 4.1.2
set.seed(3141)


##degreeC
dml_data = DoubleMLData$new(df.netIntLowDegree[complete.cases(df.netIntLowDegree[c("percentIsolation","degreeC","degreeD","homophilyC","homophilyD","heterophily")]),],
                             y_col = "percentIsolation",
                             d_cols = "degreeC",
                             x_cols = c("degreeD","homophilyC","homophilyD","heterophily"))
print(dml_data)
## ================= DoubleMLData Object ==================
## 
## 
## ------------------ Data summary      ------------------
## Outcome variable: percentIsolation
## Treatment variable(s): degreeC
## Covariates: degreeD, homophilyC, homophilyD, heterophily
## Instrument(s): 
## No. Observations: 2495
# surpress messages from mlr3 package during fitting
lgr::get_logger("mlr3")$set_threshold("warn")

learner = lrn("regr.ranger", num.trees=500, mtry=floor(sqrt(4)), max.depth=5, min.node.size=2)
ml_l = learner$clone()
ml_m = learner$clone()

obj_dml_plr = DoubleMLPLR$new(dml_data, ml_l=ml_l, ml_m=ml_m)
obj_dml_plr$fit()
print(obj_dml_plr)
## ================= DoubleMLPLR Object ==================
## 
## 
## ------------------ Data summary      ------------------
## Outcome variable: percentIsolation
## Treatment variable(s): degreeC
## Covariates: degreeD, homophilyC, homophilyD, heterophily
## Instrument(s): 
## No. Observations: 2495
## 
## ------------------ Score & algorithm ------------------
## Score function: partialling out
## DML algorithm: dml2
## 
## ------------------ Machine learner   ------------------
## ml_l: regr.ranger
## ml_m: regr.ranger
## 
## ------------------ Resampling        ------------------
## No. folds: 5
## No. repeated sample splits: 1
## Apply cross-fitting: TRUE
## 
## ------------------ Fit summary       ------------------
##  Estimates and significance testing of the effect of target variables
##         Estimate. Std. Error t value Pr(>|t|)  
## degreeC  0.004767   0.002008   2.374   0.0176 *
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
##degreeD
dml_data = DoubleMLData$new(df.netIntLowDegree[complete.cases(df.netIntLowDegree[c("percentIsolation","degreeC","degreeD","homophilyC","homophilyD","heterophily")]),],
                             y_col = "percentIsolation",
                             d_cols = "degreeD",
                             x_cols = c("degreeC","homophilyC","homophilyD","heterophily"))
print(dml_data)
## ================= DoubleMLData Object ==================
## 
## 
## ------------------ Data summary      ------------------
## Outcome variable: percentIsolation
## Treatment variable(s): degreeD
## Covariates: degreeC, homophilyC, homophilyD, heterophily
## Instrument(s): 
## No. Observations: 2495
# surpress messages from mlr3 package during fitting
lgr::get_logger("mlr3")$set_threshold("warn")

learner = lrn("regr.ranger", num.trees=500, mtry=floor(sqrt(4)), max.depth=5, min.node.size=2)
ml_l = learner$clone()
ml_m = learner$clone()

obj_dml_plr = DoubleMLPLR$new(dml_data, ml_l=ml_l, ml_m=ml_m)
obj_dml_plr$fit()
print(obj_dml_plr)
## ================= DoubleMLPLR Object ==================
## 
## 
## ------------------ Data summary      ------------------
## Outcome variable: percentIsolation
## Treatment variable(s): degreeD
## Covariates: degreeC, homophilyC, homophilyD, heterophily
## Instrument(s): 
## No. Observations: 2495
## 
## ------------------ Score & algorithm ------------------
## Score function: partialling out
## DML algorithm: dml2
## 
## ------------------ Machine learner   ------------------
## ml_l: regr.ranger
## ml_m: regr.ranger
## 
## ------------------ Resampling        ------------------
## No. folds: 5
## No. repeated sample splits: 1
## Apply cross-fitting: TRUE
## 
## ------------------ Fit summary       ------------------
##  Estimates and significance testing of the effect of target variables
##         Estimate. Std. Error t value Pr(>|t|)    
## degreeD  -0.01721    0.00112  -15.36   <2e-16 ***
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
##homophilyC
dml_data = DoubleMLData$new(df.netIntLowDegree[complete.cases(df.netIntLowDegree[c("percentIsolation","degreeC","degreeD","homophilyC","homophilyD","heterophily")]),],
                             y_col = "percentIsolation",
                             d_cols = "homophilyC",
                             x_cols = c("degreeC","degreeD","homophilyD","heterophily"))
print(dml_data)
## ================= DoubleMLData Object ==================
## 
## 
## ------------------ Data summary      ------------------
## Outcome variable: percentIsolation
## Treatment variable(s): homophilyC
## Covariates: degreeC, degreeD, homophilyD, heterophily
## Instrument(s): 
## No. Observations: 2495
# surpress messages from mlr3 package during fitting
lgr::get_logger("mlr3")$set_threshold("warn")

learner = lrn("regr.ranger", num.trees=500, mtry=floor(sqrt(4)), max.depth=5, min.node.size=2)
ml_l = learner$clone()
ml_m = learner$clone()

obj_dml_plr = DoubleMLPLR$new(dml_data, ml_l=ml_l, ml_m=ml_m)
obj_dml_plr$fit()
print(obj_dml_plr)
## ================= DoubleMLPLR Object ==================
## 
## 
## ------------------ Data summary      ------------------
## Outcome variable: percentIsolation
## Treatment variable(s): homophilyC
## Covariates: degreeC, degreeD, homophilyD, heterophily
## Instrument(s): 
## No. Observations: 2495
## 
## ------------------ Score & algorithm ------------------
## Score function: partialling out
## DML algorithm: dml2
## 
## ------------------ Machine learner   ------------------
## ml_l: regr.ranger
## ml_m: regr.ranger
## 
## ------------------ Resampling        ------------------
## No. folds: 5
## No. repeated sample splits: 1
## Apply cross-fitting: TRUE
## 
## ------------------ Fit summary       ------------------
##  Estimates and significance testing of the effect of target variables
##            Estimate. Std. Error t value Pr(>|t|)    
## homophilyC  -0.07881    0.01895  -4.158 3.21e-05 ***
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
##homophilyD
dml_data = DoubleMLData$new(df.netIntLowDegree[complete.cases(df.netIntLowDegree[c("percentIsolation","degreeC","degreeD","homophilyC","homophilyD","heterophily")]),],
                             y_col = "percentIsolation",
                             d_cols = "homophilyD",
                             x_cols = c("degreeC","degreeD","homophilyC","heterophily"))
print(dml_data)
## ================= DoubleMLData Object ==================
## 
## 
## ------------------ Data summary      ------------------
## Outcome variable: percentIsolation
## Treatment variable(s): homophilyD
## Covariates: degreeC, degreeD, homophilyC, heterophily
## Instrument(s): 
## No. Observations: 2495
# surpress messages from mlr3 package during fitting
lgr::get_logger("mlr3")$set_threshold("warn")

learner = lrn("regr.ranger", num.trees=500, mtry=floor(sqrt(4)), max.depth=5, min.node.size=2)
ml_l = learner$clone()
ml_m = learner$clone()

obj_dml_plr = DoubleMLPLR$new(dml_data, ml_l=ml_l, ml_m=ml_m)
obj_dml_plr$fit()
print(obj_dml_plr)
## ================= DoubleMLPLR Object ==================
## 
## 
## ------------------ Data summary      ------------------
## Outcome variable: percentIsolation
## Treatment variable(s): homophilyD
## Covariates: degreeC, degreeD, homophilyC, heterophily
## Instrument(s): 
## No. Observations: 2495
## 
## ------------------ Score & algorithm ------------------
## Score function: partialling out
## DML algorithm: dml2
## 
## ------------------ Machine learner   ------------------
## ml_l: regr.ranger
## ml_m: regr.ranger
## 
## ------------------ Resampling        ------------------
## No. folds: 5
## No. repeated sample splits: 1
## Apply cross-fitting: TRUE
## 
## ------------------ Fit summary       ------------------
##  Estimates and significance testing of the effect of target variables
##            Estimate. Std. Error t value Pr(>|t|)  
## homophilyD -0.012858   0.006836  -1.881     0.06 .
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
##heterophily
dml_data = DoubleMLData$new(df.netIntLowDegree[complete.cases(df.netIntLowDegree[c("percentIsolation","degreeC","degreeD","homophilyC","homophilyD","heterophily")]),],
                             y_col = "percentIsolation",
                             d_cols = "heterophily",
                             x_cols = c("degreeC","degreeD","homophilyC","homophilyD"))
print(dml_data)
## ================= DoubleMLData Object ==================
## 
## 
## ------------------ Data summary      ------------------
## Outcome variable: percentIsolation
## Treatment variable(s): heterophily
## Covariates: degreeC, degreeD, homophilyC, homophilyD
## Instrument(s): 
## No. Observations: 2495
# surpress messages from mlr3 package during fitting
lgr::get_logger("mlr3")$set_threshold("warn")

learner = lrn("regr.ranger", num.trees=500, mtry=floor(sqrt(4)), max.depth=5, min.node.size=2)
ml_l = learner$clone()
ml_m = learner$clone()

obj_dml_plr = DoubleMLPLR$new(dml_data, ml_l=ml_l, ml_m=ml_m)
obj_dml_plr$fit()
print(obj_dml_plr)
## ================= DoubleMLPLR Object ==================
## 
## 
## ------------------ Data summary      ------------------
## Outcome variable: percentIsolation
## Treatment variable(s): heterophily
## Covariates: degreeC, degreeD, homophilyC, homophilyD
## Instrument(s): 
## No. Observations: 2495
## 
## ------------------ Score & algorithm ------------------
## Score function: partialling out
## DML algorithm: dml2
## 
## ------------------ Machine learner   ------------------
## ml_l: regr.ranger
## ml_m: regr.ranger
## 
## ------------------ Resampling        ------------------
## No. folds: 5
## No. repeated sample splits: 1
## Apply cross-fitting: TRUE
## 
## ------------------ Fit summary       ------------------
##  Estimates and significance testing of the effect of target variables
##             Estimate. Std. Error t value Pr(>|t|)    
## heterophily  -0.09098    0.02362  -3.851 0.000118 ***
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
fig1 = ggplot(data = df.netIntLowDegree, 
                         aes(x = degreeD, y = homophilyC, color = avgCoopFinal*100)) + 
  geom_point() +
  scale_x_continuous("Mean degree of defectors") + 
  scale_y_continuous("C-assortativity") +  
  scale_color_viridis(option = "magma") +
  labs(color="Cooperation in \nfinal round (%)")

fig2 = ggplot(data = df.netIntLowDegree, 
                         aes(x = degreeD, y = homophilyD, color = avgCoopFinal*100)) + 
  geom_point() +
  scale_x_continuous("Mean degree of defectors") + 
  scale_y_continuous("D-assortativity") +  
  scale_color_viridis(option = "magma") +
  labs(color="Cooperation in \nfinal round (%)")

fig3 = ggplot(data = df.netIntLowDegree, 
                         aes(x = degreeD, y = heterophily, color = avgCoopFinal*100)) + 
  geom_point() +
  scale_x_continuous("Mean degree of defectors") + 
  scale_y_continuous("Heterophily") +  
  scale_color_viridis(option = "magma") +
  labs(color="Cooperation in \nfinal round (%)")

fig4 = ggplot(data = df.netIntLowDegree, 
                         aes(x = degreeC, y = homophilyC, color = avgCoopFinal*100)) + 
  geom_point() +
  scale_x_continuous("Mean degree of cooperators") + 
  scale_y_continuous("C-assortativity") +  
  scale_color_viridis(option = "magma") +
  labs(color="Cooperation in \nfinal round (%)")

fig5 = ggplot(data = df.netIntLowDegree, 
                         aes(x = degreeC, y = homophilyD, color = avgCoopFinal*100)) + 
  geom_point() +
  scale_x_continuous("Mean degree of cooperators") + 
  scale_y_continuous("D-assortativity") +  
  scale_color_viridis(option = "magma") +
  labs(color="Cooperation in \nfinal round (%)")


fig6 = ggplot(data = df.netIntLowDegree, 
                         aes(x = degreeC, y = heterophily, color = avgCoopFinal*100)) + 
  geom_point() +
  scale_x_continuous("Mean degree of cooperators") + 
  scale_y_continuous("Heterophily") +  
  scale_color_viridis(option = "magma") +
  labs(color="Cooperation in \nfinal round (%)")

fig7 = ggplot(data = df.netIntLowDegree, 
                         aes(x = degreeC, y = degreeD, color = avgCoopFinal*100)) + 
  geom_point() +
  scale_x_continuous("Mean degree of cooperators") + 
  scale_y_continuous("Mean degree of defectors") +  
  scale_color_viridis(option = "magma") +
  labs(color="Cooperation in \nfinal round (%)")

print(ggarrange(fig1,fig2,fig3,fig4,fig5,fig6,fig7,common.legend = TRUE,legend="right"))
## Warning: Removed 1 rows containing missing values (`geom_point()`).
## Removed 1 rows containing missing values (`geom_point()`).
## Warning: Removed 5 rows containing missing values (`geom_point()`).
## Warning: Removed 1 rows containing missing values (`geom_point()`).
## Warning: Removed 5 rows containing missing values (`geom_point()`).
## Warning: Removed 1 rows containing missing values (`geom_point()`).
## Removed 1 rows containing missing values (`geom_point()`).

Several explanations

Evolution of cooperation

This seems to occur regardless of initial defector/cooperator position (the same number of C's become D's, and the same number of D's become C's)